处理后从文件中删除行

2024-04-28 19:35:17 发布

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

我正在逐行阅读文件中的内容。一旦行处理,我清除它。这是密码

import os
lines = open('q0.txt').readlines()

for i, line in enumerate(lines[:]):
    print line
    flag = raw_input()
    print lines[i]
    del lines[i]

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

我正在浏览大型q0.txt。我的意图是,如果中间有任何中断,我不应该再重新处理以前处理过的行。你知道吗

在上面的代码中,虽然我删除了lines[i],但它仍然保留在文件中。怎么了?你知道吗


Tags: 文件inimporttxt密码内容foros
2条回答

由于raw_input阻塞了您的代码,您可能需要将进程分成两个threads:一个是main,另一个是您在代码中创建的。由于线程以不可预知的顺序(有点)并发运行,您将无法准确地控制中断将到达主循环的线路。线程是一个非常棘手的部分,它需要大量的阅读、测试和检查为什么事情会以这种方式发生。。。你知道吗

另外,由于您不介意使用行,因此可以执行所谓的破坏性读取:将文件的内容加载到lines变量中,并继续使用pop()获取最后一个,直到要使用的行用完为止(或者标志已被激活)。检查pop()方法在列表中的作用。注意pop()总是返回列表的最后一项。如果您希望按原始顺序打印项目,则必须使用以前reversed列表中的shiftpop。你知道吗

import threading

interrupt=None

def flag_activator():
    global interrupt
    interrupt = raw_input("(!!) Type yes when you wanna stop\n\n")
    print "Oh gosh! The user input %s" % interrupt

th = threading.Thread(target=flag_activator)
th.start()


fr = open('q0.txt', 'r')
lines = fr.readlines()
fr.close()

while lines and interrupt != 'yes':
    print "I read this line: %s" % lines.pop()

if len(lines) > 0:
    print "Crap! There are still lines"
    fw = open('q0.txt', 'w')
    fw.writelines(lines)
    fw.close()

现在,该代码将阻止您的终端,直到您在终端上键入yes。你知道吗

PS:不要忘记关闭打开的文件(如果不想显式调用close(),请参阅with语句herehere

编辑(根据OP对我误解的评论):

如果您希望确保在脚本突然停止时文件不会包含已处理的行,那么一种低效(但简单)的方法是:

  1. 打开文件进行读写(每个操作需要不同的文件描述符)
  2. 将文件的所有行加载到一个变量中
  3. 处理第一行
  4. 从列表变量中删除该行
  5. 将剩余列表写入文件
  6. 重复此操作,直到不再加载。你知道吗

尽管所有这些打开/关闭文件的操作都非常非常低效,但它是这样的:

done = False
while done == False:
    with open("q0.txt", 'r') as fr, open("q0.txt", 'w') as fw:
        lines = fr.readlines()
        if len(lines) > 0:
            print lines[0] # This would be your processing
            del lines[0]
            fw.writelines(lines)
        else:
            done = True

我希望上面的代码在某处抛出一个IndexError。你知道吗

为什么?假设您的脚本读取100行文件。lines[:]将有100行。 同时,del lines[i]将继续删除项。你知道吗

最终,for循环将到达第100个元素。如果有,即使是一个del操作,del lines[99]也会失败并抛出索引器。你知道吗

因此,当存在已删除的数据时,open('q0.txt', 'w').writelines(lines)行永远不会执行。因此,文件继续保持不变。你知道吗

这是我的理解。你知道吗

相关问题 更多 >