Python在读取行时截断它们

2024-06-14 17:04:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,它从文件中读取行,并在读取时在每行上运行它的魔力。一旦该行被读取并正确处理,我想从文件中删除该行。已保留已删除行的备份。我想做一些像

file = open('myfile.txt', 'rw+')
for line in file:
   processLine(line)
   file.truncate(line)

这似乎是一个简单的问题,但我想做的是正确的,而不是一大堆复杂的seek()和tell()调用。

也许我真正想做的就是从文件中删除一行。

在这个问题上花了很长时间之后,我决定每个人都可能是对的,这不是一个好的做事方法。这似乎是一个很好的解决方案。我想要的是一个类似于FIFO的东西,它可以让我从文件中弹出行。


Tags: intxt应用程序forlineseek备份open
3条回答

您不能。在当前的文件系统上,实际的文本文件实现是不可能的。

文本文件是连续的,因为文本文件中的行可以是任意长度的。 删除某一行意味着从那一点开始重写整个文件。

假设你有一个文件有以下三行

'line1\nline2reallybig\nline3\nlast line'

要删除第二行,必须移动磁盘中第三行和第四行的位置。唯一的方法是将第三行和第四行存储在某个地方,截断第二行上的文件,然后重写丢失的行。

如果知道文本文件中每一行的大小,可以使用.truncate(line_size * line_number)在任何位置截断文件,但即使这样,也必须重写行后的所有内容。

最好在文件中保留一个索引,这样就可以从上次停止的地方开始,而不会破坏文件的一部分。像这样的方法会奏效:

try :
    for index, line in enumerate(file) :
        processLine(line)
except :
    # Failed, start from this line number next time.
    print(index)
    raise

完成后删除所有行:

with open('myfile.txt', 'r+') as file:
    for line in file:
        processLine(line)
    file.truncate(0)

单独移除每条线:

lines = open('myfile.txt').readlines()

for line in lines[::-1]: # process lines in reverse order
    processLine(line)
    del lines[-1]  # remove the [last] line

open('myfile.txt', 'w').writelines(lines)

只能保留导致异常的行:

import fileinput

for line in fileinput.input(['myfile.txt'], inplace=1):
    try: processLine(line)
    except Exception:
         sys.stdout.write(line) # it prints to 'myfile.txt'

一般来说,正如其他人已经说过的,你想做什么是个坏主意。

相关问题 更多 >