【发布时间】:2014-11-15 18:30:22
【问题描述】:
我想用 os.remove() 删除一个文件,然后对目录中剩余的文件做一些工作。但是,我发现 os.listdir() 在超过一定大小时仍然包含已删除的文件。 “好的”,我想,“os.remove() 只是异步工作。没什么大不了的,我将使用 os.path.isfile() 检查文件是否已被完全删除”。结果证明这行不通。以下代码举例说明了这个问题:
import os
with open("test/test.txt", 'w') as file:
for _ in range(100):
file.write("spam")
print os.path.isfile("test/test.txt")
print os.listdir("test/")
os.remove("test/test.txt")
print os.path.isfile("test/test.txt")
print os.listdir("test/")
这将创建一个 400 字节的小文件。输出如预期:
True
['test.txt']
False
[]
但是当写入的“垃圾邮件”数量增加到 10 000 000(一个 40Mb 的文件)时,会出现以下输出:
True
['test.txt']
False
['test.txt']
所以,isfile() 很清楚文件已被删除,但 listdir() 还没有发现。
是否有一种更可靠的方法来检查文件是否存在,并且始终与以下 listdir() 调用一致?
在 Windows 7 上使用 Python 2.7 进行测试,这是否重要。
----编辑
我无意立即打开任何文件;我想在列表框中显示目录中剩余的所有文件。我觉得打开每个文件来检查它是否有不必要的地方,但也许这就是 Python 的做事方式?
【问题讨论】:
-
我注意到,如果我以交互方式运行它,那么它对两个文件的工作方式相同,正如预期的那样。所以,我认为这与时机有关。可能在脚本中运行时,在 isfile 和 listdir 运行之前 remove 操作还没有完成,各自对状态的反应不同。
-
我不知道这有多大帮助,但这段代码的行为就像你在我的 Mac 上所期望的那样。因此,它很可能专门针对 Windows 文件交互。
-
我在 windows 7 / python 2.7.2.5 上试过这个,没有看到你的问题。第二个
os.listdir没有列出任何文件。我认为这是一个严重错误。我在本地驱动器和 Linux samba 服务器的 CIFS 共享上尝试了它。您使用的是什么媒体?谁能重现这个?!
标签: python python-2.7