Python:os.isfile()和os.listdir()之间的不一致性

Python:os.isfile()和os.listdir()之间的不一致性,python,python-2.7,Python,Python 2.7,我想用os.remove()删除一个文件,然后对目录中的其余文件执行一些操作。但是,我发现os.listdir()在文件超过一定大小时仍然包含已擦除的文件。“好的,”我想,“os.remove()只是异步工作。没什么大不了的,我只需要使用os.path.isfile()来检查文件是否已经被完全删除”。结果证明这是行不通的。以下代码举例说明了该问题: import os with open("test/test.txt", 'w') as file: for _ in range(100

我想用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
[]
但当写入的“垃圾邮件”数量增加到10000 000(40Mb文件)时,会出现以下输出:

True
['test.txt']
False
['test.txt']
因此,isfile()非常清楚该文件已被删除,但listdir()尚未流行

是否有一种更可靠的方法来检查文件是否存在,并且始终与下面的listdir()调用一致

在Windows7上使用Python2.7进行测试,如果有必要的话

----编辑


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

你没有提到你想对这些文件做什么,但是在Python中,请求原谅比请求允许更容易,所以如果出了问题,尝试任何方法并失败

import os
import glob
import errno

def process(file_handle):
    for line in file_handle:
        return line

for fn in glob.iglob('*.py'):
    try:
        with open(fn) as f:
            print(process(f))
    except IOError as e:
        if e.errno == errno.ENOENT:
            # file doesn't exist, ignore
            pass
        else:
            # some other error we don't want to suppress
            raise

在Windows中,如果删除由其他文件打开的文件(使用“文件共享”和“删除”),则该文件在关闭之前不会被实际删除。相反,它的条目保留在那里,标记为“delete pending”(并且您不能用模糊的错误打开它)。我认为这是造成差异的原因-
os.path.isfile
看到它存在,但不再是“常规文件”

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

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


当然,当您在查询条目时发生更改时,这会提供竞争条件的机会。在这种情况下,除非您有一个支持系统调用事务的操作系统,否则这是不可避免的;只是盲目地做你想做的事,抓住错误。在处理文件时加倍正确。如果您想分割可能捕获的
IOError
s,也可以查看该包。我注意到,如果以交互方式运行它,那么它对两个文件的效果都是一样的,正如预期的那样。所以,我认为这与时间有关。也许当您在脚本中运行它时,在isfile和listdir运行之前,删除操作尚未完成,并且每个操作对状态的反应都不同。我不知道这有多大帮助,但这段代码的行为与您在我的Mac上预期的一样。所以它很可能是关于Windows文件交互的,我在Windows7/Python2.7.2.5上尝试了这个,但没有发现您的问题。第二个
os.listdir
没有列出任何文件。我认为这是一个严重的错误。我在本地驱动器和到linux samba服务器的CIFS共享上进行了尝试。你用的是什么媒体?谁能复制这个?!使用,我刚刚确认了一种情况,当ProcMon在感兴趣的目录上报告
DELETE PENDING
时,
os.path.exists()
os.path.isdir()
都返回
False
print [f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f))]