[英]python looping through input file
我的問題與使用open()
Python中的文件輸入有關。 我有一個文本文件mytext.txt
有3行。 我試圖用這個文件做兩件事:打印線條,並打印行數。
我嘗試了以下代碼:
input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
print line
for line in input_file:
count_lines += 1
print 'number of lines:', count_lines
結果:它正確打印3行,但打印“行數:0”(而不是3)
我找到了兩種解決方法,並將其打印3
:
1)我使用一個循環而不是兩個循環
input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
print line
count_lines += 1
print 'number of lines:', count_lines
2)在第一個循環之后,我再次定義input_file
input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
print line
input_file = open('mytext.txt', 'r')
for line in input_file:
count_lines += 1
print 'number of lines:', count_lines
對我來說,似乎定義input_file = ...
僅對一個循環有效,就好像它在我用它循環后被刪除一樣。 但是我不明白為什么,可能它還不是100%清楚,在Python中如何處理variable = open(filename)
。
順便說一下,我看到在這種情況下最好只使用一個循環。 但是,我覺得我必須清楚這個問題,因為有些情況我可以/必須使用它。
文件句柄是一個迭代器。 迭代文件后,指針將定位在EOF(文件末尾),迭代器將引發退出循環的StopIteration。 如果你試圖將一個迭代器用於指針位於EOF的文件,它只會引發StopIteration並退出:這就是為什么它在第二個循環中計數為零的原因。 您可以使用input_file.seek(0)
回滾文件指針,而無需重新打開它。
也就是說,在同一個循環中計數行的I / O效率更高,否則你必須再次從磁盤讀取整個文件來計算行數。 這是一種非常常見的模式:
with open('filename.ext') as input_file:
for i, line in enumerate(input_file):
print line,
print "{0} line(s) printed".format(i+1)
在Python 2.5中,文件對象已經配備了__enter__
和__exit__
來解決with
語句接口 。 這是類似於以下內容的語法糖:
input_file = open('filename.txt')
try:
for i, line in enumerate(input_file):
print line,
finally:
input_file.close()
print "{0} line(s) printed".format(i+1)
我認為cPython會在收集垃圾時關閉文件句柄,但我不確定這是否適用於每個實現 - 恕我直言,明確關閉資源句柄是更好的做法。
有什么理由你不能使用以下內容:
input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
print line
count_lines += 1
print 'number of lines:', count_lines
open返回的東西是一個文件對象。 當你循環遍歷它們時,文件對象會跟蹤它們自己的內部位置,所以為了做你先嘗試過的事情,你必須手動將它倒回到開頭,它不會自己完成它。
嘗試在兩個循環之間添加input_file.seek(0)
。 這會將文件回退到開頭,因此您可以再次循環它。
我瘦你的模塊文件輸入是你想要的。
if __name__ == "__main__":
for line in fileinput.input():
if fileinput.isfirstline():
print("current file: %s" % fileinput.filename())
print("line number: %d, current file number: %d" %
(fileinput.lineno(), fileinput.filelineno()))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.