2

我正在使用import fileinput在 Ubuntu 机器上运行的 Python 脚本。

我正在命令行上运行脚本,其中包含我用来迭代行的行python myscript.py firstinputfile.txt secondinputfile.txt和内部的内容。我遇到的问题是两者都使用 Macintosh ( ) 行结尾,并且似乎没有被识别为行分隔符。 myscript.pyfor line in fileinput.input()firstinputfile.txtsecondinputfile.txt\rfileinput.input()\r

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

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

有什么建议么?

4

1 回答 1

3

原来fileinput.input()支持一个可选openhook参数:

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

此外,通用换行支持文档建议可以使用以下rU模式打开文件以支持 Windows/Unix/Macintosh 换行:

以 'U' 或 'rU' 模式打开文件将打开一个文件以在通用换行模式下读取。在各种文件方法(如 read() 和 readline())返回的字符串中,所有三个行结束约定都将转换为“\n”。

因此,您可以编写一个小函数作为参数传递,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现在被认为是行分隔符。

于 2012-12-13T09:39:10.717 回答