我正在逐行阅读文件中的内容。一旦行处理,我清除它。这是密码
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]
,但它仍然保留在文件中。怎么了?你知道吗
由于
raw_input
阻塞了您的代码,您可能需要将进程分成两个threads:一个是main
,另一个是您在代码中创建的。由于线程以不可预知的顺序(有点)并发运行,您将无法准确地控制中断将到达主循环的线路。线程是一个非常棘手的部分,它需要大量的阅读、测试和检查为什么事情会以这种方式发生。。。你知道吗另外,由于您不介意使用行,因此可以执行所谓的破坏性读取:将文件的内容加载到
lines
变量中,并继续使用pop()
获取最后一个,直到要使用的行用完为止(或者标志已被激活)。检查pop()方法在列表中的作用。注意pop()
总是返回列表的最后一项。如果您希望按原始顺序打印项目,则必须使用以前reversed列表中的shift或pop
。你知道吗现在,该代码将阻止您的终端,直到您在终端上键入
yes
。你知道吗PS:不要忘记关闭打开的文件(如果不想显式调用
close()
,请参阅with
语句here和here)编辑(根据OP对我误解的评论):
如果您希望确保在脚本突然停止时文件不会包含已处理的行,那么一种低效(但简单)的方法是:
尽管所有这些打开/关闭文件的操作都非常非常低效,但它是这样的:
我希望上面的代码在某处抛出一个
IndexError
。你知道吗为什么?假设您的脚本读取100行文件。
lines[:]
将有100行。 同时,del lines[i]
将继续删除项。你知道吗最终,for循环将到达第100个元素。如果有,即使是一个
del
操作,del lines[99]
也会失败并抛出索引器。你知道吗因此,当存在已删除的数据时,
open('q0.txt', 'w').writelines(lines)
行永远不会执行。因此,文件继续保持不变。你知道吗这是我的理解。你知道吗
相关问题 更多 >
编程相关推荐