Windows上的__repr__在终端中不显示回车符

时间:2016-06-21 20:33:34

标签: python windows csv carriage-return repr

我正在尝试在python 2&上测试使用csv.writer生成的csv文件3在Linux(Ubuntu 16.04 x64)和Windows(x64)上。不幸的是,Windows每次写入文件时都会额外增加\r

我以为我会通过尝试在这些文件中打印repr行来调试此问题,但repr的输出并未显示Windows上存在\r

例如,来自csv文件的一行在Windows的终端中显示如下:

'display,resource,refs\n'

同一文件中的相同句子在Ubuntu上显示如下:

'display,resource,refs\r\n'

如何调试添加到我的文件中的额外\r

2 个答案:

答案 0 :(得分:0)

我找到了一个名为dos2unix的实用程序,可通过pip安装。

要将所有\r\n个实例转换为我的csv文件的\n个实例,我可以使用此代码:

import os
os.system("dos2unix -n "+filename+" "+filename)

答案 1 :(得分:0)

问题是windows和linux以不同方式定义行尾标记。对于linux,它只是换行符'\n',但对于Windows,它是换行符,后跟回车符'\r\n'

当您在Windows上以Python文本模式打开文件时,任何换行符都会自动转换为'\r\n'。这是可取的,因为Windows上的许多其他程序不会将换行符本身视为新行标记(例如记事本)。

为了解决这个问题,您可以明确告诉python您希望新行标记看起来像什么。例如

with open("text.txt", "w", newline="\n") as f:
    f.write("hello\n")
    f.write("world\n")

# open in binary mode so we can see exactly what is in the file
with open("text.txt", "rb") as f:
    data = f.read()

print(repr(data))
assert data == b"hello\nworld\n" 

如果您使用的是Python 2,则需要使用open模块中的io函数。