apa*_*apa 202 python windows csv newline
在运行Windows XP专业版的Python 2.7中:
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()
Run Code Online (Sandbox Code Playgroud)
它生成一个文件test.csv,每行有一个额外的\ r \n,如下所示:
hi,dude\r\r\nhi2,dude2\r\r\n
Run Code Online (Sandbox Code Playgroud)
而不是预期的:
hi,dude\r\nhi2,dude2\r\n
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,或者这实际上是期望的行为?
Joh*_*hin 270
在Windows上,始终以二进制模式("rb"或"wb")打开文件,然后再将它们传递给csv.reader或csv.writer.
虽然该文件是文本文件,但CSV被所涉及的库视为二进制格式,"\ r \n"分隔记录.如果该分隔符是以文本模式编写的,则Python运行时将"\n"替换为"\ r \n",因此将在文件中观察到的"\ r \n \n \n"替换为"\ r \n \n".
请参阅此前一个答案.
这个答案发布于2010年,并没有解决Python3中的问题.
如@ YiboYang的回答所述,Python3中的一个可能的修复是打开文件,newline=''参数设置为空字符串:
with open('output.csv', 'w', newline='') as f:
writer = csv.writer(f)
...
Run Code Online (Sandbox Code Playgroud)
Jas*_*mbs 231
虽然@ john-machin给出了一个很好的答案,但并不总是最好的方法.例如,除非您将所有输入编码为CSV编写器,否则它不适用于Python 3.此外,如果脚本要使用sys.stdout作为流,则不会解决此问题.
我建议在创建编写器时设置'lineterminator'属性:
import csv
import sys
doc = csv.writer(sys.stdout, lineterminator='\n')
doc.writerow('abc')
doc.writerow(range(3))
Run Code Online (Sandbox Code Playgroud)
该示例将适用于Python 2和Python 3,并且不会产生不需要的换行符.但请注意,它可能会产生不合需要的换行符(省略Unix操作系统上的LF字符).
但是,在大多数情况下,我认为行为比将所有CSV视为二进制格式更为可取且更自然.我提供这个答案作为您考虑的替代方案.
Yib*_*ang 51
在Python 3中(我没有在Python 2中尝试过这个),你也可以这样做
with open('output.csv','w',newline='') as f:
writer=csv.writer(f)
writer.writerow(mystuff)
...
Run Code Online (Sandbox Code Playgroud)
根据文件.
在doc的脚注中有更多相关内容:
如果未指定newline ='',则不会正确解释嵌入在引用字段中的换行符,并且在写入时使用\ r \n linendings的平台上将添加额外的\ r \n.指定newline =''应始终是安全的,因为csv模块执行自己的(通用)换行处理.
您可以在 csv writer 命令中引入 lineterminator='\n'参数。
import csv
delimiter='\t'
with open('tmp.csv', '+w', encoding='utf-8') as stream:
writer = csv.writer(stream, delimiter=delimiter, quoting=csv.QUOTE_NONE, quotechar='', lineterminator='\n')
writer.writerow(['A1' , 'B1', 'C1'])
writer.writerow(['A2' , 'B2', 'C2'])
writer.writerow(['A3' , 'B3', 'C3'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
138358 次 |
| 最近记录: |