【问题标题】:Combining readline() and for loop without using next() in python结合 readline() 和 for 循环而不在 python 中使用 next()
【发布时间】:2013-08-16 16:35:20
【问题描述】:

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

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。

请就如何摆脱这些错误或实现我的逻辑提出建议..

【问题讨论】:

    标签: python readline


    【解决方案1】:

    使用任一 next() 和循环,使用 .readline(),但不要同时使用两者。

    将文件对象用作可迭代对象会创建一个内部缓冲区,这会混淆下一个.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))
    

    【讨论】:

    • 嘿,非常感谢...我正在寻找您提供的 readline() 的替代品!..它有效:-)
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2020-02-22
    • 2021-12-02
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多