【问题标题】:Reset iteration index after using next() Python使用 next() Python 后重置迭代索引
【发布时间】:2015-11-26 07:03:18
【问题描述】:

我正在尝试使用 fileinput.input(filename, inplace=1) 编辑文本文件 文本文件有 5 行:

line 0
line 1
line 2 
line 3
line 4

我希望根据line 2 中的信息更改line 1 的数据。 所以我使用for 循环

infile = fileinput.input(filename, inplace=1)
for line in infile:
 if(line2Data):
   #do something on line1
   print line,
 else:
   line1=next(infile)
   line2=next(infile) 
   #do something with line2

现在我的问题是在第一次迭代后line 设置为line2,所以在第二次迭代中该行设置为line3。我希望在第二次迭代中将 line 设置为 line1。我试过line = line,但它不起作用。 您能否告诉我如何重置 line 上的迭代索引,该索引由于 next 而发生更改

PS:这是我正在处理的大型文件和函数的一个简单示例。

【问题讨论】:

  • 为什么不把第一行存起来,以后再用呢?
  • 因为文件必须连续打印
  • 你怎么知道你想重新开始?你想总是从头开始吗?
  • 是的,我想从头开始或从下一个索引重新开始,即 1

标签: python file iteration next


【解决方案1】:

没有办法重置迭代器,但没有什么可以阻止您在开始循环之前进行一些处理:

infile = fileinput.input("foo.txt")

first_lines = [next(infile) for x in range(3)]
first_lines[1] = first_lines[1].strip() + " this is line2 > " + first_lines[2]
print "\n".join(first_lines)

for line in infile:
    print line

这使用next() 将前 3 行读入列表。然后它根据line2 更新line1 并打印所有这些。然后它继续使用正常循环打印文件的其余部分。

对于您的示例,输出将是:

line 0

line 1 this is line2 > line 2 

line 2 

line 3

line 4

注意,如果您尝试修改文件本身的第一行,而不仅仅是显示它,您需要将整个文件写入一个新文件。写入文件不像在字处理器中那样工作,当添加一行或字符时,所有行都向下移动。就像您处于overwrite 模式一样。

【讨论】:

    【解决方案2】:

    据我所知(这并不多),没有办法重置迭代器。这个SO question 可能有用。既然你说文件很大,我能想到的就是只处理部分数据。在这个SO question 中的nosklos 回答之后,我会尝试这样的事情(但这实际上只是第一个猜测):

    while True:
        for line in open('really_big_file.dat')
            process_data(line)
            if some_condition==True:
                break
    

    好的,您可能希望从上一个索引开始的答案未通过此尝试捕获。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2020-08-11
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2014-01-23
      相关资源
      最近更新 更多