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

Sha*_*pta 31 python-2.7

我只是python中的新手,对于noobish问题感到抱歉

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)

其中两个是文件,那么当它应该是True时输出为False的原因是什么?

qap*_*hla 42

当你打印时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))
Run Code Online (Sandbox Code Playgroud)

编辑:

正如icktoofay在下面的评论中所提到的,更好的解决方案可能是更换线路

print(os.path.isfile(os.path.join("/home/user/desktop/1", i)))
Run Code Online (Sandbox Code Playgroud)

或者更早地将"/ home/user/desktop/1"存储到某个变量x,允许替换行

print(os.path.isfile(os.path.join(x,i)))
Run Code Online (Sandbox Code Playgroud)

  • 如果目录名和文件名都在变量中,那么`os.path.join`可以避免在它们之间硬编码`/`. (6认同)

Rob*_*zos 7

问题出在您的CWD(当前工作目录)上,因为os.listdir()为您提供了与提供的路径相关的文件,并且它与CWD不一致.解决方法是在使用os.listidr()之前设置CWD:

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

os.chdir(dir_to_delete)

[f for f in os.listdir() if os.path.isfile(f)]
Run Code Online (Sandbox Code Playgroud)

或者只修复文件路径:

[f for f in os.listdir(dir_to_delete) if os.path.isfile(os.path.join(dir_to_delete, f))]
Run Code Online (Sandbox Code Playgroud)