我有以下代码:
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()
每次只返回一个空列表。
代码中可能存在一个愚蠢的错误或拼写错误,但我找不到它。提前谢谢。
答案 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()
快退到文件的开头,但这不必要地复杂。