Python在读取行时截断行

Python在读取行时截断行,python,file-io,Python,File Io,我有一个应用程序,它从文件中读取行,并在读取时在每行上运行它的魔法。一旦该行被读取并正确处理,我想从文件中删除该行。已保留已删除线路的备份。我想做一些像 file = open('myfile.txt', 'rw+') for line in file: processLine(line) file.truncate(line) 这似乎是一个简单的问题,但我希望做得正确,而不是大量复杂的seek()和tell()调用 也许我真正想做的就是从文件中删除一行 在花了很长时间研究这个问题

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

file = open('myfile.txt', 'rw+')
for line in file:
   processLine(line)
   file.truncate(line)
这似乎是一个简单的问题,但我希望做得正确,而不是大量复杂的seek()和tell()调用

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


在花了很长时间研究这个问题之后,我认为每个人都是对的,这不是一个好的做事方式。这似乎是一个非常优雅的解决方案。我想要的是类似于FIFO的东西,它可以让我从文件中弹出行。

在阅读时截断文件似乎有点极端。如果您的脚本有一个不会导致错误的bug怎么办?在这种情况下,您需要在文件开头重新启动


让脚本打印它中断的行号,并将行号作为参数,这样您就可以告诉它从哪一行开始处理了,怎么样?

首先,调用操作
truncate
可能不是最好的选择。如果我正确理解了这个问题,您希望删除文件中当前位置的所有内容。(我希望
truncate
能够将从当前位置到文件末尾的所有内容都剪切掉。这就是标准Python
truncate
方法的工作原理,至少如果我搜索正确的话。)

其次,我不确定在使用
for
循环进行迭代时修改文件是否明智。保存已处理的行数并在主循环完成后删除它们不是更好吗,异常与否?文件迭代器支持,这意味着以后删除处理过的行应该相当简单


另外,我不懂Python,请恕我直言。

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

try :
    for index, line in enumerate(file) :
        processLine(line)
except :
    # Failed, start from this line number next time.
    print(index)
    raise
完成后删除所有行: 分别拆下每一行: 只能保留导致异常的行:
总的来说,正如其他人所说,你想做什么是个坏主意。

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

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

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

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


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

一篇相关文章似乎有一个很好的策略来做到这一点,请参阅

我使用它的方式如下:

  import os;

  tasklist_file = open(tasklist_filename, 'rw');  
  first_line = tasklist_file.readline();
  temp = os.system("sed -i -e '1d' " + tasklist_filename); # remove first line from task file;
我不确定它在Windows上是否有效。
在mac电脑上试用了一下,效果确实不错。

这就是我用于基于文件队列的方法。它返回第一行并用其余的重写文件。完成后,将返回“无”:

def pop_a_text_line(filename):
    with open(filename,'r') as f:
        S = f.readlines()
    if len(S) > 0:
        pop = S[0]
        with open(filename,'w') as f:
            f.writelines(S[1:])
    else:
        pop = None
    return pop

只有当行上的操作完成时,文件才会被截断。我也会将这些数据写入备份文件。。。但是你没有真正回答这个问题。这会截断整个文件。@Ryan:是的,会的。完全按照你的要求。处理完所有行后,您希望将它们全部删除。如果不是这样的话,请澄清你的问题。不,在我的帖子里,我在哪里说过我所有的问题都是截断一行。你的编辑是一种有趣的方法。似乎每个人都讨厌我试图做的事情,但我发誓这有一个非常有效的用例。@gopi1410:您最初的评论是正确的<如果需要删除多行,代码>删除行[i]将无法按预期工作。我已经更新了答案另一种看待这个问题的方式是我想实现一个基于文件的FILO队列。基于文件的队列:有趣的是,我不太希望能够从文件中删除随机行。这将是非常困难的。更像是在读取文件时截断文件(在开头或结尾)。这并不能回答问题。随机访问删除行不是问题的一部分(无论是明确的还是暗示的)。@Guidenstern检查问题编辑历史记录和答案时间戳。+1-使用sed将是最好的脏方法
'line1\nline2reallybig\nline3\nlast line'
  import os;

  tasklist_file = open(tasklist_filename, 'rw');  
  first_line = tasklist_file.readline();
  temp = os.system("sed -i -e '1d' " + tasklist_filename); # remove first line from task file;
def pop_a_text_line(filename):
    with open(filename,'r') as f:
        S = f.readlines()
    if len(S) > 0:
        pop = S[0]
        with open(filename,'w') as f:
            f.writelines(S[1:])
    else:
        pop = None
    return pop