Python 在读取时截断行

新手上路,请多包涵

我有一个应用程序,它从文件中读取行并在读取的每一行上运行它的魔法。读取并正确处理该行后,我想从文件中删除该行。已保留已删除行的备份。我想做类似的事情

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

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

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

在这个问题上花了很长时间之后,我认为每个人都可能是对的,这不是做事的好方法。它看起来是如此优雅的解决方案。我一直在寻找类似于 FIFO 的东西,它可以让我从文件中弹出行。

原文由 Ryan White 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 667
2 个回答

完成后删除所有行:

 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, sys

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

通常,正如其他人已经说过的那样,您尝试做的事情是个坏主意。

原文由 jfs 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

假设您有一个包含以下 3 行的文件;

 'line1\nline2reallybig\nline3\nlast line'

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

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

原文由 nosklo 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题