gpt4 book ai didi

Python:os.isfile() 和 os.listdir() 之间的分歧

转载 作者:太空宇宙 更新时间:2023-11-03 11:29:09 25 4
gpt4 key购买 nike

我想用 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 测试过,应该有问题。

----编辑

我无意立即打开任何文件;我想在列表框中显示目录中剩余的所有文件。我觉得打开每个文件来检查它是否不需要,但也许这就是 pythonic 做事的方式?

最佳答案

在 Windows 中,如果您删除了由其他工具(使用 FILE_SHARE_DELETE)打开的文件,它在关闭之前不会真正被删除。相反,它的条目保留在那里,标记为“删除待定”(并且您无法打开它并出现一个模糊的错误)。我认为这是造成差异的原因 - os.path.isfile 看到它存在但不再是“常规文件”。

如果是这种情况,os.path.exists 应该返回 True

在这种情况下,一种可能的解决方案是列出所有文件(具有过滤掉目录等的额外好处),即

print [f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f))]

当然,当您在查询条目时发生某些变化时,这为竞争条件提供了机会。在这种情况下,这是不可避免的,除非您有一个支持系统调用事务的操作系统。

关于Python:os.isfile() 和 os.listdir() 之间的分歧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26812534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com