Python中带有for循环的ValueError

Python中带有for循环的ValueError,python,file-read,Python,File Read,我需要创建一个函数,根据数字列表返回文件中的某些行,但我不断得到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()

我需要创建一个函数,根据数字列表返回文件中的某些行,但我不断得到
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

您正在混合使用f中的
行和
f.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
调用才会从文件中读取数据。

您正在混合
for line in f
f.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
调用才会从文件中读取数据。

迭代
f
中的行就足够了:

with open(path) as f:
    for i, line in enumerate(f):
       if i in lst:
           # do something
           ans += [line.strip()]
这假设定义了
路径
lst
ans
。由于您正在迭代文件中的行,因此不需要
f.readlines()
,也不需要递增器。只需使用
枚举


注意,串行列表连接(即最后一行)效率低下。根据你想做什么,看看哪个更快,传统上更像蟒蛇。考虑@ Burhan Khalid的方法。

< P>在<代码> f < /代码>中重复行应该足够:

with open(path) as f:
    for i, line in enumerate(f):
       if i in lst:
           # do something
           ans += [line.strip()]
这假设定义了
路径
lst
ans
。由于您正在迭代文件中的行,因此不需要
f.readlines()
,也不需要递增器。只需使用
枚举


注意,串行列表连接(即最后一行)效率低下。根据你想做什么,看看哪个更快,传统上更像蟒蛇。考虑一下Burhan Khalid的方法。

< P>你可以简单地用列表理解:

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])
如果您的
行\u编号
没有0索引(1是第一行),则需要调整循环:

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

您可以简单地通过列表理解这一点:

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])
如果您的
行\u编号
没有0索引(1是第一行),则需要调整循环:

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

第3行,什么是
i
?从0i开始的变量有一个文本文件和一个数字列表。我只需要返回与这些数字对应的行。列表是否已排序?您可以对f:
中的行使用
.readline()
,而不是两者都使用。一行3,从0i开始的
I
?变量有一个文本文件和一个数字列表。我只需要返回与这些数字对应的行。列表是否已排序?您可以对f:
中的行使用
,也可以使用
。readline()
,而不是两者都使用。