结合readline()和for循环而不在python中使用next()

时间:2013-08-16 16:35:20

标签: python readline

我正在尝试读取文件夹中的多个文本文件以绘制每个文件的特定列(最后一列)。我使用以下代码来做到这一点:

file_library = os.listdir(path)
for book in file_library:
 file = os.path.join(path, book)
  if file.endswith(".txt"):
    f = open(file, "r")
        for line in f:
            reads = read_ydata(f)
                print reads
        f.close()

其中read_ydata函数定义如下:

y_values = []
line = filename.readline()
while line != '':
 y_val = line[line.rfind(' ') + 1:]
 y_values.append(float(y_val))
 line = filename.readline()
return y_values

现在,当我运行这个时,我收到一个错误: ValueError:混合迭代和读取方法会丢失数据 如果我用next()替换它我得到错误:StopIteration。

关于如何摆脱这些错误或实现我的逻辑的Plz建议..

1 个答案:

答案 0 :(得分:3)

使用 next()并循环,使用.readline(),但不要混用两者。

将文件对象用作iterable会创建一个内部缓冲区,这会对下一个.readline()将从哪个位置读取(不使用缓冲区)造成混淆。

只需使用next(filename)代替filename.readline()即可。

next().readline()都返回包含的换行符,请确保在测试空字符串之前删除空白行。

请注意,您可以使用.rsplit()从一行的末尾拆分一个值:

y_val = line.rsplit(None, 1)[-1]

或使用.rpartition()

y_val = line.rpartition(' ')[-1]

您的函数不需要使用while循环;您也可以使用for循环并在行为空时中断:

y_values = []
for line in filename:
    if not line.strip():
        return y_values
    y_val = line.rsplit(None, 1)[-1]
    y_values.append(float(y_val))