open函数里的newline

转载至:https://www.jianshu.com/p/0b0337df165a

1.不同操作系统换行符不统一

linux:\n windows:\r\n mac:\r

2.open函数newline用法

If csvfile is a file object, it should be opened with newline=’’.
上述引用来自python 中关于csv标准库的介绍,对于这句话相当疑惑,因此,编写以下程序来辨别。

Case 1: The file is read and written with newline=’’.

csvfile=open(‘csvfile.csv’,‘w’,newline=’’)

writer=csv.writer(csvfile)

writer.writerow(‘a’)

writer.writerow(‘b’)

csvfile.close()

csvfile=open(‘csvfile.csv’,‘r’,newline=’’)

txtdata=csvfile.read()

csvfile.close()
最终,txtdata中的内容为’a\r\nb\r\n’。

Case 2: The file is written with newline=’’, but read without it.

csvfile=open(‘csvfile.csv’,‘w’,newline=’’)

writer=csv.writer(csvfile)

writer.writerow(‘a’)

writer.writerow(‘b’)

csvfile.close()

csvfile=open(‘csvfile.csv’,‘r’)

txtdata=csvfile.read()

csvfile.close()

最终,txtdata中的内容为’a\r\nb\r\n’。

Case 3: The file is written without newline=’’, but read with it.

csvfile=open(‘csvfile.csv’,‘w’)

writer=csv.writer(csvfile)

writer.writerow(‘a’)

writer.writerow(‘b’)

csvfile.close()

csvfile=open(‘csvfile.csv’,‘r’,newline=’’)

txtdata=csvfile.read()

csvfile.close()
最终,txtdata中的内容为’a\r\r\nb\r\r\n’。

Case 4: The file is read and written without newline=’’.

csvfile=open(‘csvfile.csv’,‘w’)

writer=csv.writer(csvfile)

writer.writerow(‘a’)

writer.writerow(‘b’)

csvfile.close()

csvfile=open(‘csvfile.csv’,‘r’)

txtdata=csvfile.read()

csvfile.close()
最终,txtdata中的内容为’a\n\nb\n\n’。

原因分析

On input,if newline is None, universal newlines mode is enabled. Lines in the input can end in ‘\n’, ‘\r’, or ‘\r\n’, and these are translated into ‘\n’ before being returned to the caller. If it is ‘’, universal newline mode is enabled, but line endings are returned to the caller untranslated. If it has any of the other legal values, input lines are only terminated by the given string, and the line ending is returned to the caller untranslated.

On output,if newline is None, any ‘\n’ characters written are translated to the system default line separator,os.linesep. If newline is ‘’, no translation takes place. If new line is any of the other legal values, any ‘\n’ characters written are translated to the given string.
csv标准库中的writerow在写入文件时会加入’\r\n’作为换行符,if newline is ‘’,换行符不会被转化而是直接输出,如case 1所示。

当写文件时newline=’’,程序写入’a\r\nb\r\n’;读取文件时newline=None,universal newlines mode工作,换行符’\r\n’被翻译为’\n’,如case 2所示。

当写文件时newline=None,csv先是将’a\r\nb\r\n’写入内存,再写入文件时,universal newlines mode工作,换行符’\n’被翻译为’\r\n’,最终结果如case 3所示。

当写文件时newline=None,csv先是将’a\r\nb\r\n’写入内存,再写入文件时,universal newlines mode工作,换行符’\n’被翻译为’\r\n’;读取文件时newline=None,universal newlines mode工作,换行符’\r’和’\r\n’被翻译为’\n’,显示为’a\n\nb\n\n’,如case 4所示。

作者:neil_tired
链接:https://www.jianshu.com/p/0b0337df165a

你可能感兴趣的:(open函数里的newline)