2017-02-19 74 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]