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

我在命令行上运行脚本,并在python myscript.py firstinputfile.txt secondinputfile.txt内和myscript.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()

有什么建议么?

最佳答案

事实证明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/

10-13 07:46