将Windows中的文件传递到python脚本时,我的\ r删除了我的字符

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 3对用户透明地处理每种换行类型(\ n,\ r或\ r \ n)。您的文件有哪一个都无所谓,您不必担心。
  • 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)只是普通字符。