python - 逐行读取文件,有时读取同一循环中的下一行

标签 python

我想在 python 中逐行读取文件,但在某些情况下(基于 if 条件)我还想读取文件中的下一行,然后继续以相同的方式读取它.

示例:

    file_handler = open(fname, 'r')
    for line in file_handler:
       if line[0] == '#':
           print line
       else:
           line2 = file_handler.readline()
           print line2

基本上,在这个示例中,我尝试逐行读取它,但是当该行不以 # 开头时,我想读取下一行,打印它,然后继续阅读第2行之后的行。这只是一个示例,我在代码中执行类似的操作时遇到了错误,但我的目标如标题中所述。

但是我会收到类似ValueError:混合迭代和读取方法会丢失数据之类的错误。

是否有可能以更聪明的方式做我想做的事情?

最佳答案

如果您只是想跳过不以 # 开头的行,有一种更简单的方法可以做到这一点:

file_handler = open(fname, 'r')
    for line in file_handler:
       if line[0] != '#':
           continue
       # now do the regular logic
       print line

显然这种简单化的逻辑并不适用于所有可能的情况。如果没有,您必须严格执行错误所暗示的操作:要么一致地使用迭代,要么一致地使用读取方法。这会更加乏味且容易出错,但也没有那么糟糕。

例如,使用readline:

while True:
    line = file_handler.readline()
    if not line:
        break
    if line[0] == '#':
        print line
    else:
        line2 = file_handler.readline()
        print line2

或者,通过迭代:

lines = file_handler
for line in file_handler:
    if line[0] == '#':
        print line
    else:
        print line
        print next(file_handler)

但是,最后一个版本有点“作弊”。您依赖于这样一个事实:for 循环中的迭代器与创建它的可迭代对象是相同的。对于文件来说确实如此,但对于列表之类的东西则不然。所以实际上,您应该在这里执行相同类型的 while True 循环,除非您想添加显式的 iter 调用(或者至少有一条注释解释为什么您不这样做)需要一个)。

更好的解决方案可能是编写一个生成器函数,根据您的规则将一个迭代器转换为另一个迭代器,然后打印出该生成器迭代的每个值:

def doublifier(iterable):
    it = iter(iterable)
    while True:
        line = next(it)
        if line.startswith('#'):
            yield line, next(it)
        else:
            yield (line,)

关于python - 逐行读取文件,有时读取同一循环中的下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16289147/

相关文章:

Python/MySQL 错误

python - 如何循环遍历空格列表并在特定情况下将空格分配到另一个列表?

python - 如何更新 python 附带的模块?

python - 为 Windows 7 构建 Mesa。Mesa 9.1

python - 使用 Electron 应用程序时如何从 Angular 组件与 Python 后端通信?

python - 用pip安装后尝试导入scapy失败

python - 在 Python 中将表/数据框与公共(public)列连接起来

python - Python连接MYSQL,获取SP500符号

python - 训练Dialogflow疑惑

python - 带有redis后端的 celery