2017-09-02 95 views
4

我想從文件中讀取第25行到第55行,但範圍似乎只輸出單個數字和6行,當它應該是30行時。按編號輸出特定行

hamlettext = open('hamlet.txt', 'r') 
for i in range (25,55): 
    data = hamlettext.readlines(i) 

print(i) 
print(data) 

輸出:

54 
['\n', 'Mar.\n', 'O, farewell, honest soldier;\n', "Who hath reliev'd you?\n"] 

回答

4

使用內置enumerate功能:

for i, line in enumerate(hamlettext): 
    if i in range(25, 55): 
     print(i) 
     print(line) 
+0

謝謝!這兩個答案的工作很好 - 枚舉能夠打印得更乾淨,沒有每行中的引號。這是枚舉中的內置清理嗎? – aiwan

+0

@aiwan:根據文檔,'enumerate'返回一個包含count(從start開始,默認爲0)和從迭代中獲得的值的元組。在文件的情況下,它會創建一對像'(0,'這是第一行\ n')',然後可以用它來跟蹤一個行的位置。您可以通過點擊我的答案中的超鏈接閱讀更多關於'枚舉'的信息。 –

+0

知道了,謝謝! – aiwan

-2

所以你i在上面的代碼打印的最後一行。要讀取從25到55的所有行,您需要在循環內打印數據。

hamlettext = open('hamlet.txt', 'r') 
    for i in range (25,55): 
     data = hamlettext.readlines(i) 

     print(i) 
     print(data) 
+0

這是不正確的,因爲'readlines(i)'不會從文件中檢索行'i'。 「如果給定一個可選參數'sizehint',它會從文件中讀取很多字節,並且足夠多的來完成一行,並從中返回行。」 –

2

你可以讀取該文件完全然後切片獲得的行列表:

with open('hamlet.txt', 'r') as f: 
    data = f.readlines()[25:55] 

如果該文件是大的,但是,它是更好地跳過25行,然後閱讀,然後全身而退循環,以避免讀取千條其他線路白白:

with open('hamlet.txt', 'r') as f: 
    for i, line in enumerate(hamlettext): 
     if i < 25: 
      continue 
     elif i >= 55: 
      break 
     else: 
      print(i,line.rstrip()) 

還要注意,如果你用文本編輯器比較行號,有0是一個1偏移(蟒蛇開始,編輯從1開始,所以你可以se enumerate(hamlettext,1)來解決這個問題。