Python readlines没有返回任何内容?

时间:2015-03-05 08:38:23

标签: python file python-3.x

我有以下代码:

with open('current.cfg', 'r') as current:
    if len(current.read()) == 0:
        print('FILE IS EMPTY')
    else:
        for line in current.readlines():
            print(line)

该文件包含:

#Nothing to see here
#Just temporary data
PS__CURRENT_INST__instance.12
PS__PREV_INST__instance.16
PS__DEFAULT_INST__instance.10

出于某种原因,current.readlines()每次只返回一个空列表。

代码中可能存在一个愚蠢的错误或拼写错误,但我找不到它。提前谢谢。

2 个答案:

答案 0 :(得分:10)

您已读取文件,文件指针不在文件的 end 。然后调用readlines()将不会返回数据。

只读一次文件:

with open('current.cfg', 'r') as current:
    lines = current.readlines()
    if not lines:
        print('FILE IS EMPTY')
    else:
        for line in lines:
            print(line)

另一种选择是在再次阅读之前重新开始:

with open('current.cfg', 'r') as current:
    if len(current.read()) == 0:
        print('FILE IS EMPTY')
    else:
        current.seek(0)
        for line in current.readlines():
            print(line)

但这只是在浪费CPU和I / O时间。

最好的方法是尝试读取数据量,或者寻找到最后,使用file.tell()获取文件大小,然后回头查看,一切都没有阅读。然后使用该文件作为迭代器,以防止将所有数据读入内存。这样,当文件非常大时,您就不会产生内存问题:

with open('current.cfg', 'r') as current:
    if len(current.read(1)) == 0:
        print('FILE IS EMPTY')
    else:
        current.seek(0)
        for line in current:
            print(line)

with open('current.cfg', 'r') as current:
    current.seek(0, 2)  # from the end
    if current.tell() == 0:
        print('FILE IS EMPTY')
    else:
        current.seek(0)
        for line in current:
            print(line)

答案 1 :(得分:1)

执行current.read()时,使用文件内容,以便后续current.readlines()返回空列表。

Martijn Pieters的代码是要走的路。

或者,您可以在current.seek(0)之前使用readlines()快退到文件的开头,但这不必要地复杂。