[英]How does python read lines from file
考慮以下簡單的python代碼:
f=open('raw1', 'r')
i=1
for line in f:
line1=line.split()
for word in line1:
print word,
print '\n'
在第一個for循環(即“ for line in f:”)中,python如何知道我要讀取一行而不是單詞或字符?
第二行更加清晰,因為第1行是一個列表。 因此,第二個循環將遍歷列表元素。
Python具有所謂的“可迭代”的表示法。 它們是知道如何讓您遍歷它們所擁有的某些數據的東西。 一些常見的迭代器是列表,集合,字典,幾乎每個數據結構。 文件也不例外。
從事態發展成為迭代是通過定義一個方法用一個返回一個對象next
方法。 該next
方法應被重復調用,並每次返回下一個數據。 for foo in bar
循環中的for foo in bar
實際上只是在幕后反復調用next
方法。
對於文件, next
方法返回行,僅此而已。 它並不“知道”您想要線條,而只是總是要返回線條。 這樣做的原因是,大約有50%的涉及文件遍歷的案例都是按行排列的,如果您需要文字,
for word in (word for line in f for word in line.split(' ')):
...
效果很好。
在python中, for..in語法用於可迭代對象(可以迭代的元素)。 對於文件對象,迭代器是文件本身。
請參考此處的next()方法的文檔-摘錄如下:
文件對象是其自己的迭代器,例如iter(f)返回f(除非關閉f)。 當文件用作迭代器時,通常在for循環中(例如,對於f中的行:打印行),將重復調用next()方法。 此方法返回下一個輸入行,或在打開文件進行讀取時(如果打開文件則為EOF)(在打開文件進行寫入時行為未定義),則引發StopIteration。 為了使for循環成為遍歷文件行的最有效方法(一種非常常見的操作),next()方法使用了隱藏的預讀緩沖區。 使用預讀緩沖區的結果是,將next()與其他文件方法(如readline())結合使用是不正確的。 但是,使用seek()將文件重新定位到絕對位置將刷新預讀緩沖區。 2.3版的新功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.