Python将\ r \ n识别为行分隔符

时间:2012-12-13 07:58:52

标签: python line-endings file-io

我在Ubuntu框上运行的Python脚本中使用import fileinput

我正在命令行上运行脚本,其中包含python myscript.py firstinputfile.txt secondinputfile.txtmyscript.py内部的内容。我正在使用for line in fileinput.input()来迭代这些行。我遇到的问题是firstinputfile.txtsecondinputfile.txt都使用Macintosh(\r)行结尾,而fileinput.input()似乎没有认出\r作为行分隔符。

有没有办法强制fileinput\r识别为行分隔符?

我考虑过预处理firstinputfile.txtsecondinputfile.txt使用\n行结尾,但我有点犹豫,原因有两个:i)我真的不想发出额外的文件来管理和ii)我仍然希望fileinput的输入来自文件参数(在管道命令后不是stdin)所以我可以使用fileinput.filename()fileinput.filelineno()

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

事实证明fileinput.input()支持可选的openhook参数:

  

您可以通过提供开启挂钩来控制文件的打开方式   fileinput.input()或FileInput()的openhook参数。钩子   必须是一个带有两个参数的函数,文件名和模式,以及   返回一个相应打开的文件类对象。两个有用的钩子是   已经由这个模块提供。

此外,universal newline support文档建议使用rU模式打开文件以支持Windows / Unix / Macintosh换行符:

  

使用“U”或“rU”模式打开文件将打开一个文件进行读取   在通用换行模式下。所有三行结尾约定都将是   在各种文件返回的字符串中翻译为“\ n”   read()和readline()等方法。

因此,您可以编写一个小函数作为openhook参数传递,该参数将以支持通用换行符的方式打开文件:

def univ_file_read(name, mode):
    # WARNING: ignores mode argument passed to this function
    return open(name, 'rU')

然后,而不是:

for line in fileinput.input():

使用:

for line in fileinput.input(openhook=univ_file_read):

这似乎为我做了诀窍,现在\r被识别为行分隔符。