我在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()
。
有什么建议么?
最佳答案
事实证明fileinput.input()支持可选的openhook
参数:
您可以通过以下方式提供打开挂钩来控制如何打开文件
将openhook参数设置为fileinput.input()或FileInput()。钩子
必须是带有两个参数(文件名和模式)的函数,并且
返回相应打开的类似文件的对象。两个有用的钩子是
该模块已提供。
此外,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
现在被认为是行定界符。关于python - Python将\r识别为行定界符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13855414/