我有一个Python脚本,在Windows机器上运行和在Mac上运行时会产生不同的输出。深入挖掘后,我发现这是因为当Python读取来自Mac(从文件)的换行符时,它读取了\r\n
,而在Windows中,\r
消失了。
因此,如果我将脚本中的每个\n
更改为\r\n
,它在Mac上可以正常工作。但如果我这样做,它就不能在Windows PC上运行。
有没有简单的方法解决这个问题?
我有一个Python脚本,在Windows机器上运行和在Mac上运行时会产生不同的输出。深入挖掘后,我发现这是因为当Python读取来自Mac(从文件)的换行符时,它读取了\r\n
,而在Windows中,\r
消失了。
因此,如果我将脚本中的每个\n
更改为\r\n
,它在Mac上可以正常工作。但如果我这样做,它就不能在Windows PC上运行。
有没有简单的方法解决这个问题?
不同平台使用不同的代码表示“换行”。Windows使用\r\n,Unix使用\n,旧版mac使用\r,是的,有些系统使用\n\r。
当你在Python 3中以文本模式打开文件时,它会将所有换行符转换为'\n'并完成。
infile = open("filename", 'r')
文本模式是默认的,所以如果你什么也不说,就是文本模式。但明确说明总是更好的选择:
infile = open("filename", 'rt')
如果你不想进行行结束符的翻译,请以二进制模式打开文件:
infile = open("filename", 'rb')
在Python 2中,情况有所不同。只有在Windows上默认情况下才会发生这种转换。 如果你想在其他平台上也进行转换,可以添加通用换行符标志:
infile = open("filename", 'rU')
但是您说您正在使用Python 3,而在文本模式下,在所有平台上都会发生这种情况,因此添加U标志不应该有任何区别。
os.linesep
在所有平台(不仅仅是 Windows)上都被替换为 \n
。如果 os.linesep == '\n'
,则在 Python 2 中与无转换相同。 - jfs'\n'
。 - Lennart Regebrocodecs.open()
,那么如何处理这个问题? - Intelligent-Infrastructure'U'
模式:我猜这可能取决于你正在读什么,但是内置的 open() 函数需要一个“mode”参数,如果你将模式设置为 'U',Python 2 将以透明的跨平台方式处理换行符。 这需要使用支持通用换行符的 Python 构建进行操作,但可以试试!
https://docs.python.org/2/library/functions.html#open
在Python 3中,默认行为是使用'U'
模式,正如文档所解释的那样:
还有一个额外的模式字符
'U'
,它不再起作用,并被视为弃用。它之前启用了universal newlines以在文本模式下成为默认行为。有关详细信息,请参阅newline参数的文档。
mode="U"
。如果您想要禁用通用换行符,则可以传递 newline="\n"
或其他内容。请参见此问题。 - user3064538Open()
方法有一个newline
参数:
newline
控制通用换行模式的工作方式(仅适用于文本模式)。它可以是None、''、'\n'、'\r'和'\r\n'。它的工作方式如下:当从流中读取输入时,如果
newline
为None,则启用通用换行模式。输入中的行可以以'\n'、'\r'或'\r\n'结尾,这些在返回给调用者之前将被转换为'\n'。如果它是'',则启用通用换行模式,但行末不会被翻译并原样返回给调用者。如果它有任何其他合法值,则输入行仅由给定字符串终止,并且行结束未被翻译并原样返回给调用者。当向流中写入输出时,如果
newline
为None,则写入的任何'\n'字符都会转换为系统默认的行分隔符os.linesep。如果newline
为''或'\n',则不进行翻译。如果newline
是任何其他合法值,则写入的任何'\n'字符都会转换为给定的字符串。
U
模式说明符的旧方式已被弃用,建议使用这种新方式。https://pythonconquerstheuniverse.wordpress.com/2011/05/08/newline-conversion-in-python-3/
glob.glob
并没有声明以任何特定顺序返回结果,因此没有理由期望它们按任何特定顺序排列。 - Mark