os.path.isdir()对当前目录生效但拼接路径目录判断失效的原因
问题根因
os.listdir()返回的结果仅为对应目录下的文件/子文件夹名称,不携带任何路径前缀;而os.path.isdir()做路径判断时,不会自动关联你传入os.listdir()的目标目录,只会基于当前Python进程的工作目录解析你传入的路径。
- 第一个循环能正常运行,是因为你传入
os.listdir()的路径就是当前工作目录cwd,拿到裸文件名后直接传给os.path.isdir()时,程序刚好在cwd下查找对应文件,路径匹配,判断结果正确。 - 第二个循环失效,是因为你用
os.listdir(t)拿到了t目录下的文件列表,但直接把裸文件名传给os.path.isdir(i)时,程序依然在当前工作目录cwd下查找名为i的文件,根本不会去t目录下检索,路径不匹配,自然无法返回正确的判断结果。
修复方案
做文件类型判断前,先把os.listdir()对应的目标目录和返回的文件名拼接成完整绝对路径,再传给os.path.isdir()即可,修正后的代码如下:
import os import os.path def es68(dirname): cwd = os.getcwd() stuff = os.listdir(cwd) for i in stuff: # 拼接完整路径,避免工作目录变动导致判断失效 item_path = os.path.join(cwd, i) if os.path.isdir(item_path): print(i) t = os.path.join(cwd, dirname) stuff_t = os.listdir(t) for i in stuff_t: # 必须拼接目标目录t和当前文件名,才能定位到正确的文件 item_path_t = os.path.join(t, i) if os.path.isdir(item_path_t): print(i)
额外提示
- 无需写
os.path.isdir(xxx) == True这类冗余判断,os.path.isdir()本身返回布尔值,直接作为if的判断条件即可。 - 即便是第一个处理当前工作目录的循环,也建议统一使用拼接完整路径的写法,避免代码运行过程中调用
os.chdir()修改了工作目录,导致原本正常的逻辑突然出错。
内容的提问来源于stack exchange,提问作者Giovanni Montaruli
相关产品推荐
相关产品推荐

