mcl*_*lzc 5 python newline carriage-return linefeed
我有一个像这样的文件:
A\r
B\n
C\r\n.
Run Code Online (Sandbox Code Playgroud)
(通过\ r,我指的是CR,而\ n是LF)
这个脚本:
import fileinput
for line in fileinput.input(mode='rU'):
print(line)
Run Code Online (Sandbox Code Playgroud)
当我打电话时,python script.py myfile.txt我得到正确的输出:
A
B
C
Run Code Online (Sandbox Code Playgroud)
但是当我这样称呼它时type myfile.txt|python script.py,我得到了:
B
C
Run Code Online (Sandbox Code Playgroud)
你看?没有更多的“ A”。
怎么了?我认为mode='rU'它将解决所有换行问题。
编辑:在Python 3中没有这样的问题!仅在Python 2中。但这不能解决问题。
谢谢
编辑:
仅出于完整性考虑。-在Linux中也是如此。
Python 2需要将参数mode ='rU'传递给fileinput.input,以使其能够透明地处理每个换行符。问题是,在Python 2中,当将内容传递给它时,它不能正常工作。尝试通过管道传输这样的文件:
CR: \r
LF: \n
CRLF: \r\n
Run Code Online (Sandbox Code Playgroud)Python 2只是将这两行视为一行,如果您尝试使用以下代码打印每一行:
for i,line in enumerate(fileinput.input(mode='rU')):
print("Line {}: {}".format(i,line), end='')
Run Code Online (Sandbox Code Playgroud)
它输出:
Line 0: CR:
LF:
Line 1: CRLF:
Run Code Online (Sandbox Code Playgroud)
在Python 3中不会发生这种情况。这里有2行不同。当将此文本作为文件传递时,它可以正常工作。
像这样管道数据:
LF: \n
CR: \r
CRLF: \r\n
Run Code Online (Sandbox Code Playgroud)
给我类似的结果:
Line 0: LF:
Line 1: CR:
CRLF:
Run Code Online (Sandbox Code Playgroud)
我的结论如下:
出于某种原因,在传递数据时,Python 2寻找它遇到的第一个换行符,然后继续,它只是将特定字符视为换行符。在此示例中,Python 2遇到\ r作为第一个换行符,而所有其他字符(\ n或\ r \ n)只是普通字符。