是否可以使用迭代器從文件中讀取值,以便在迭代結束時自動關閉文件?從文件讀取值的迭代器
使用with
語句創建這樣一個迭代器似乎不起作用。
with open('/dev/zero', 'rb') as f:
values = iter(f.read(1) for i in (1, 2, 3))
values.next() #ValueError: I/O operation on closed file
是否可以使用迭代器從文件中讀取值,以便在迭代結束時自動關閉文件?從文件讀取值的迭代器
使用with
語句創建這樣一個迭代器似乎不起作用。
with open('/dev/zero', 'rb') as f:
values = iter(f.read(1) for i in (1, 2, 3))
values.next() #ValueError: I/O operation on closed file
如果你想使用with
你需要做的:
def file_generator(filename):
with open(filename,'rb') as file:
for i in (1, 2, 3):
yield file.read(1)
values = file_generator('/dev/zero')
next(values)
但是,如果你沒有達到這個迭代結束時,你將永遠不會關閉文件,所以它在本質上是不從非常不同:
file = open(filename,'rb')
next(file)
file.close()
當處理一個文件,這是最好的經歷,一次就全部,如果你能,然後將其關閉,一旦你用它做。保持打開文件的句柄通常不是一個可靠的解決方案。
fileinput模塊爲你做。打開和關閉文件是自動處理的。
import fileinput
files = ['path to file']
iterator = fileinput.input(files)
for line in iterator:
print(line)
你可以把多個文件路徑列表的input
法就像是在讀取一個文件時,它會遍歷其生產線。
謝謝。我認爲標準的'file'對象已經允許你遍歷行。問題在於何時需要遍歷不是行或不是順序的數據位。 –
您需要創建一個包裝類,實現'__iter__'和'__next__',並在引發'StopIteration'時調用'f .__ exit __()'。 –
你試圖做的事情是不可取的,因爲如果你忘記迭代到最後或發生異常,你會泄漏一個文件句柄。文件上的所有操作都應該在'with'內完成! – MSeifert