我在Ubuntu框上运行的Python脚本中使用import fileinput
。
我正在命令行上运行脚本,其中包含python myscript.py firstinputfile.txt secondinputfile.txt
和myscript.py
内部的内容。我正在使用for line in fileinput.input()
来迭代这些行。我遇到的问题是firstinputfile.txt
和secondinputfile.txt
都使用Macintosh(\r
)行结尾,而fileinput.input()
似乎没有认出\r
作为行分隔符。
有没有办法强制fileinput
将\r
识别为行分隔符?
我考虑过预处理firstinputfile.txt
和secondinputfile.txt
使用\n
行结尾,但我有点犹豫,原因有两个:i)我真的不想发出额外的文件来管理和ii)我仍然希望fileinput
的输入来自文件参数(在管道命令后不是stdin
)所以我可以使用fileinput.filename()
和fileinput.filelineno()
。
有什么建议吗?
答案 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
被识别为行分隔符。