我想在 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/