2017-02-19 73 views
0

我需要做一個函數,返回基於數字列表的文件中的某些行,但我一直在收到ValueError: Mixing iteration and read methods would lose data.有什麼建議嗎?Python for Value循環中的ValueError

with open(path) as f: 
    for line in f: 
     if i in lst: 
      a = f.readline() 
      ans += [a.strip()] 
      i += 1 
     else: 
      f.readline() 
      i += 1 
+1

一行3,'我'是什麼? – pylang

+0

變量從0開始 – dguo52001

+0

我有一個文本文件和一個數字列表。我只需要返回與這些數字對應的行。 – dguo52001

回答

0

你混合for line in ff.readline(),這意味着你會讀更多的線可能比你打算。爲了避免這種情況,請嘗試更改您的代碼是這樣的:

with open(path) as f: 
    while True: 
     if i in lst: 
      a = f.readline() 
      if not a: 
       break 
      ans += [a.strip()] 
      i += 1 
     else: 
      a = f.readline() 
      if not a: 
       break 
      i += 1 

這樣,只有你的readline電話從文件中讀取數據。

2

迭代在f線條應足夠了:

with open(path) as f: 
    for i, line in enumerate(f): 
     if i in lst: 
      # do something 
      ans += [line.strip()] 

這假定pathlstans定義。由於您正在迭代文件中的行,因此不需要f.readlines(),而且您不需要增量器。只需使用enumerate

注意,串行列表連接(即最後一行)是低效的。根據你想要做的,看看list comprehensions,這是更快,傳統上更Pythonic。考慮@Burhan Khalid的方法。

1

你可以簡單地這樣一個列表理解:

def filter_file(filename, line_numbers): 
    with open(filename) as f: 
     return [line.strip() for idx,line in enumerate(f) if idx in line_numbers] 

result = filter_file('some_file.txt', [1,5,7]) 

如果line_numbers不爲0索引(1爲第一行),那麼你就需要調整循環:

return [line.strip() for idx,line in enumerate(f) if idx+1 in line_numbers]