Friday, January 18, 2019

CSV in Python adding an extra carriage return, on Windows



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

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...