import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()
It generates a file, test.csv
, with an extra \r
at each row, like so:
test.csv
hi,dude\r\r\nhi2,dude2\r\r\n
instead of the expected:
hi,dude\r\nhi2,dude2\r\n
Why is this happening, or is this actually the desired behavior?
Note:
- This behavior can occur with Python 2 or 3.
Answer
Python 3:
- As described by YiboYang, set
newline=''
with open('output.csv', 'w', newline='') as f:
writer = csv.writer(f)
...
- As noted in the comments by CoDEmanX, set
newline='\n'
with open('output.csv', 'w', newline='\n', encoding='utf-8') as f:
writer = csv.writer(f)
...
Python 2:
On Windows, always open your files in binary mode ("rb"
or "wb"
), before passing them to csv.reader
or csv.writer
.
Although the file is a text file, CSV is regarded a binary format by the libraries involved, with \r\n
separating records. If that separator is written in text mode, the Python runtime replaces the \n
with \r\n
, hence the \r\r\n
observed in the file.
See this previous answer.
No comments:
Post a Comment