python open函数参数_python open函数newline用法

写这些文章主要是督促自己学习,过去两年时间,断断续续在学习linux、python以及机器学习方面的知识,东西看了很多,却没有实际动手操作,很多不明白的知识当时解决后没有记录,现在也忘得差不多了。为此,希望能在这里记录自己每天的学习轨迹,以后温习时也方便。

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 newlineis 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 newlineis None, any '\n' characters written are translated to the system default line separator,os.linesep. If newlineis '', no translation takes place. If new lineis 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所示。

你可能感兴趣的:(python,open函数参数)