Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文件迭代,检查行是否存在_Python_File_Iteration - Fatal编程技术网

Python 文件迭代,检查行是否存在

Python 文件迭代,检查行是否存在,python,file,iteration,Python,File,Iteration,我正在使用这样的for循环读取一个文件 f = open("somefile.txt") for line in f: do stuff 除了我读到的每一行之外,我需要从前面一行中取出一个项目,并将其放在当前一行中。最好的方法是什么?有没有一种方法可以在不读取的情况下读取下一行或从中获取某些项目?如果您的文件不是很大,您可以将其读入内存并在那里使用: f = open("somefile.txt") lines = f.readlines() f.close() for index

我正在使用这样的for循环读取一个文件

f = open("somefile.txt")

for line in f:
    do stuff

除了我读到的每一行之外,我需要从前面一行中取出一个项目,并将其放在当前一行中。最好的方法是什么?有没有一种方法可以在不读取的情况下读取下一行或从中获取某些项目?

如果您的文件不是很大,您可以将其读入内存并在那里使用:

f = open("somefile.txt")
lines = f.readlines()
f.close()

for index, value in enumerate(lines):
    # Check if next line exists
    if index + 1 > len(lines):
        next_line = lines(index + 1)
        # do something with line and next_line
编辑:

对于大文件,最简单的方法是记住上一行:

f = open("somefile.txt")
previous_line = f.readline()
for line in f:
    # Do something with line and previous_line
    print(line, previous_line)
    # Save this line for the next iteration
    previous_line = line
根据数据的外观,可能存在边缘情况。你的台词总是成对出现,还是在某些情况下你只需要下一行的一些信息


例如,如果您的文件只有一行,则此代码不会执行任何操作。

如果您的文件适合内存,则可以尝试以下操作:

f = open('somefile.txt')
lines = f.read().splitlines()

for current_line, next_line in zip(lines, lines[1:]):
    print current_line
    print next_line
    print '-------'
上面的代码基本上读取所有行,并使用
zip
创建包含当前行和下一行的元组列表

last_line = None

with open("somefile.txt") as f:
    for line in f:
        if not last_line == None:
            do_stuff(last_line, extract_needed_part(line))
        last_line = line
do_stuff(last_line) #The final line without anything following it.
编辑:或者,对于长文件,可以按如下方式使用库:

import itertools
f = open('somefile.txt')
i1, i2 = itertools.tee(f)
lines = itertools.izip(i1, itertools.islice(i2, 1, None))
for current_line, next_line in lines:
    print current_line
    print next_line
    print '-------'
在这种情况下:

  • itertools.tee
    用于创建使用原始文件迭代器的两个独立迭代器(一个用于当前行,另一个用于下一行)
  • itertools.slice
    用于启动第二行中的下一行迭代器
  • itertools.izip
    用于在元组中逐行连接两个迭代器的结果
编辑2:根据@eyquem的建议,您还可以打开文件两次:

import itertools
f = open('somefile.txt')
g = open('somefile.txt')
lines = itertools.izip(f, itertools.islice(g, 1, None))
for current_line, next_line in lines:
    print current_line
    print next_line
    print '-------'

如果我的理解是正确的,并且您希望使用下一行中的一些值依次处理每一行,那么我的建议就是存储您当前读取的值,然后处理最后一个值。反向操作-最后一行是当前行,下一行是下一行

last_line = None

with open("somefile.txt") as f:
    for line in f:
        if not last_line == None:
            do_stuff(last_line, extract_needed_part(line))
        last_line = line
do_stuff(last_line) #The final line without anything following it.
用数学术语来说,不是n行和n+1行,而是n-1行和n行。同样的效果


这种方法的优点是,它并不意味着在开始时加载整个文件。

或者,在尝试读取它之前,我是否可以检查下一行是否存在?您所说的“将它放在当前行”是什么意思???你想修改硬盘上记录的一行,而前面的一行中有数据??问题是文件太大了,我想在不需要将每一行存储在内存中的情况下进行处理。我希望会有一些我不知道的方法。如果其他所有操作都失败,这是一个很好的备份选项。感谢您的回复。在您的编辑示例中,这几乎是我的答案的重复,除了您没有使用with(您应该使用with)之外,对于第一次执行,前一行和前一行将是相同的。我在实际代码中有一个try,IOException子句,而不是with(为了兼容性)。这更像是一种泛化,我们可以假设文件存在并且不会返回错误。尽管如此,人们的共识似乎只是坚持前一条路线。如果这是最好的方法,我将使用.Hi Lattyware,f中的“for line”构造不会重置f的文件指针,因此分配的第一个值“line”是文件的第二行。试一试吧,迈克,我弄错了。不过,将
一起使用仍然是一种很好的做法。不需要使用tee()。只需定义另一个文件处理程序:
g=open('somefile.txt')
并使用
g.readline()
将其向前移动一行即可。然后
lines=((f.readline(),line)代表g中的行)
@eyquem谢谢您的评论。我已经编辑了答案,包括你的评论。我希望我能投票支持你的答案,但不幸的是我还没有15个声誉哈。谢谢你,我觉得这很有帮助。@user1178682如果我的回答解决了你的问题,你可以接受:
with open('somefile.txt') as f, open('somefile.txt') as g:
    g.readline()
    lines = ( (f.readline(),line) for line in g)
        for precline,aheadline in lines:
            # do what you want