python - Python3: skrivning af csv-filer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge Python 3.2 på en Windows-computer til at skrive en enkel CSV-fil, men jeg har ikke held og lykke. Fra csv modul dokumentationen til Python 3.2: [14]


>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE\_MINIMAL)
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])


producerer en fil med hver linje afsluttet af bytesekvensen , så det ser ud til, at hver linje har en ekstra tom linje, når du åbner den med for eksempel MS Excel. Dette er ikke en 'CSV-fil'.


Bemærk, hvis jeg prøver det samme eksempel for Python 2.7 i Python 3.2 (hvor den store forskel er 'w' vs 'wb' for filtilstanden), får jeg en fejl, når jeg prøver spamWriter.writerow: [15]



  Traceback (seneste opkald sidste): File '', linje 1, i TypeError: 'str' ​​understøtter ikke buffer-grænsefladen



Hvordan skriver jeg en simpel CSV-fil fra Python 3.2 på en Windows-computer?

Bedste reference


Dokumentation siger, at du skal bruge open('eggs.csv', 'w', newline='')


http://docs.python.org/py3k/library/csv.html#id2[16]

Andre referencer 1


Dette vil fungere på både Python 2 og Python 3:


if sys.version\_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')

Andre referencer 2


Som dokumenteret i en fodnote: [17] [18]



  csv.writer(csvfile, dialect='excel', **fmtparams)

   Hvis csvfile er et filobjekt, skal det åbnes med newline=''.


   Hvis newline='' ikke er angivet, vil ikke nye linjer indlejret i citerede felter blive fortolket korrekt, og på platforme der bruger \ r \ n linendings på skriv tilføjes et ekstra \ r . Det skal altid være sikkert at angive newline='', da csv-modulet har sin egen (universelle) newline-håndtering.



Den følgende variant fungerer på Linux og Windows:


spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', quotechar='|',
                        quoting=csv.QUOTE\_MINIMAL, newline='')
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

Andre referencer 3


For at svare direkte på dit spørgsmål, skal du kunne bruge lineterminator formatering parameter: [19]


... så ændring af denne linje skal fungere (ikke testet):


>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE\_MINIMAL, lineterminator='
')


Hvad angår hvorfor eksemplet ikke virker ud af boksen, ser det ud som en fejl for mig.

Andre referencer 4


Jeg har løst denne fejl, da jeg flyttede en af ​​mine koder fra Python2.6.6 til python3.4.3


Python2.6.6 (Jeg forsøger at gøre noget forvirring på min csvfile)


with open( os.path.join(path, name) , 'r') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))


Oven har fungeret godt med python2.6.6, men fungerede ikke på python3.4.3, da jeg fik nogle utf-8 unicode-fejl, da jeg forsøgte at køre python3-filen, så jeg lavede nedenstående ændringer
Python3.4.4


import codecs
with codecs.open(os.path.join(path, name) , 'r', encoding='ISO-8859-1') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))


Det er det, min kode fungerer fint nu, python3 overvejer i grunden ikke noget af unicode, og vi skal bruge codecs importen for at få det til at fungere, håber det hjælper ..

Andre referencer 5


[[For Python 2.x]]
Denne implementering af spamwriter virker for mig ...


with open('assignmentresults.csv', 'wb') as csvfile:
  spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE\_MINIMAL)
  spamwriter.writerow(["Hullo", "World"])