我发现每次打开文件并阅读其内容时,它都会自动关闭。所以下次我必须再次打开该文件才能阅读它。我知道减少内存使用量可能是一个好主意。但由于我当前的任务,我需要不断打开文件。
我该怎么做?
这是我目前阅读文件的方式
f = open('some_file', 'rU')
f.read()
答案 0 :(得分:4)
执行f.read()
后,文件不会关闭。事实上,除非你明确地调用f.close()
或者在像这样的with块中使用它,否则它不会关闭:
with open('some_file') as f:
...
在这种情况下,当with块结束时,文件将被关闭。当文件对象没有更多与之关联的变量时(即,当f
超出范围或被重新分配时),它也将倾向于关闭,但这不是保证的行为。如果这些都不会发生, 文件将保持打开状态。
您最有可能看到的问题是再次调用read
会得到一个空字符串。这不会发生,因为文件已关闭 - 从已关闭的文件中读取会给您一个错误。相反,文件会跟踪您已阅读的位置,因此,如果您只读取其中的一部分,则可以请求 next 部分,它将从正确的位置开始。要将其重新设置为再次从文件的开头读取,您可以使用seek
方法:
with open('some_file') as f:
contents1 = f.read()
f.seek(0)
contents2 = f.read()
将为您提供包含文件全部内容的contents1和contents2,而不是contents2为空。但是,除非文件在此期间发生变化,否则您可能不想这样做。
答案 1 :(得分:0)
要确保您的文件一致打开或始终打开,您需要关闭文件或seek
至0
。
while True:
f = open(...)
x = f.read()
print x
f.close()
或
f = open(...)
while True:
x = f.read()
print x
f.seek(0)
...除非你打算写一个单行代码,它会自动关闭。
print open('some_file', 'rU').read()
这避免了对打开文件数量的任何限制。
补充一点:您也可以再次使用for line in open(...): pass
,只要您记得以这种或那种方式到达文件的开头。