Friday 18 January 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

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...