使Python的readline方法识别两种行尾变化?

时间:2010-11-11 19:49:19

标签: python

我正在编写一个Python文件,需要读入几个不同类型的文件。在使用for line in f后,我正在使用传统的f = open("file.txt", "r")逐行阅读文件。

这似乎并不适用于所有文件。我的猜测是一些文件以不同的编码结束(例如\ r \ n与仅\ r \ n)。我可以读取整个文件并在\ r \ n上执行字符串拆分,但这是非常昂贵的,我宁愿不。有没有办法让Python的readline方法识别出两种行尾变化?

2 个答案:

答案 0 :(得分:18)

使用通用换行支持 - 请参阅http://docs.python.org/library/functions.html#open

  

除了标准的fopen()   值模式可以是“U”或“rU”。蟒蛇   通常用通用的方式构建   换行支持;提供'U'打开   该文件作为文本文件,但行可以   被以下任何一项终止:   Unix的行尾约定'\ n',   Macintosh约定'\ r',或   Windows约定'\ r \ n'。所有的   这些外部表征是   被Python程序看作'\ n'。如果   Python没有通用的构建   换行符支持“U”模式   与普通文本模式相同。注意   这样打开的文件对象也有   名为newlines的属性有一个   值为None(如果还没有换行符   被看见了,'\ n','\ r','\ r \ n'或者a   包含所有换行符类型的元组   可见

答案 1 :(得分:0)

您可以尝试使用生成器方法自行读取行并忽略任何EOL字符:

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):
    # ...