如何让Python的readline方法识别两种行尾变体?

12 投票
2 回答
10126 浏览
提问于 2025-04-16 06:56

我正在写一个Python文件,需要读取几种不同类型的文件。我用传统的方法逐行读取文件,代码是 for line in f,在此之前我用 f = open("file.txt", "r") 打开文件。

不过,这种方法似乎并不适用于所有文件。我猜是因为有些文件的结尾编码不同(比如有的用的是 \r\n,有的只是 \r)。我可以把整个文件读进来,然后用字符串分割 \r,但这样做非常耗资源,我不想这样做。有没有办法让Python的readline方法同时识别这两种换行符?

2 个回答

0

你可以尝试用生成器的方法自己读取每一行,并忽略掉任何行结束符号:

def readlines(f):
    line = []
    while True:
        s = f.read(1)
        if len(s) == 0:
            if len(line) > 0:
                yield line
            return
        if s in ('\r','\n'):
            if len(line) > 0:
                yield line
            line = []
        else:
            line.append(s)

for line in readlines(yourfile):
    # ...
18

使用通用换行符支持 -- 详情请见 http://docs.python.org/library/functions.html#open

除了标准的 fopen() 方法,模式还可以是 'U' 或 'rU'。Python 通常是支持通用换行符的;使用 'U' 打开文件时,会把它当作文本文件来处理,但文件中的行可以用以下任意一种方式结束:Unix 系统的换行符 '\n',Mac 系统的换行符 '\r',或者 Windows 系统的换行符 '\r\n'。在 Python 程序中,这些不同的换行符都会被视作 '\n'。如果 Python 是在没有通用换行符支持的情况下构建的,那么带有 'U' 的模式就和普通的文本模式是一样的。需要注意的是,这种方式打开的文件对象还有一个叫做 newlines 的属性,它的值可能是 None(如果还没有遇到换行符),也可能是 '\n'、'\r'、'\r\n',或者是一个包含所有遇到的换行符类型的元组。

撰写回答