簡體   English   中英

python循環輸入文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM