为什么os.path.isfile返回False?

52
>>> import os
>>> os.listdir("/home/user/Desktop/1")
['1.txt', '2', '3.txt']
>>> os.path.isfile("/home/user/Desktop/1/1.txt")
True
>>> for i in os.listdir("/home/user/Desktop/1"):
...     print(os.path.isfile(i))
...
False
False
False
>>>

其中两个是文件,为什么输出结果应该是True,但却是False

2个回答

54
当你打印os.path.isfile(i)时,你正在检查"1.txt"或"2"或"3.txt"是否是文件,而当你运行 os.path.isfile("/home/user/Desktop/1/1.txt") 时,你有一个完整的文件路径。 尝试用以下行替换它:
print(os.path.isfile("/home/user/desktop/1/" + i))

编辑:

如在icktoofay的评论中所提到的,更好的解决方案可能是用以下内容替换该行:

print(os.path.isfile(os.path.join("/home/user/desktop/1", i)))

或者将 "/home/user/desktop/1" 存储到某个变量 x 中,允许该行被替换为

print(os.path.isfile(os.path.join(x,i)))

6
如果目录名和文件名存储在变量中,使用os.path.join可以避免在它们之间硬编码/ - icktoofay

11

问题出在你的CWD(当前工作目录)上,因为os.listdir()提供相对于所提供路径的文件,这与CWD不一致。 解决方法是在使用os.listdir()之前设置你的CWD:

dir_to_delete = '/home/user/Desktop/1'

os.chdir(dir_to_delete)

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

或者只是修复文件路径:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接