gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:59:42 27 4
gpt4 key购买 nike

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

例子:

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

基本上在这个例子中,我试图逐行阅读它,但是当该行不是以 # 开头时,我想阅读下一行,打印它,然后继续阅读line2 之后的行。这只是一个例子,我在我的代码中做类似的事情时遇到错误,但我的目标如标题所述。

但我会收到类似ValueError: Mixing iteration and read methods would lose data这样的错误。

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

最佳答案

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com