课后30讲显示当前路径下文件夹及各文件数量问题
如附件是当前路径和上一路径截图。1、用参考答案试了下,能正确显示:
代码:
import os
all_files = os.listdir(os.curdir) # 使用os.curdir表示当前目录更标准
type_dict = dict()
for each_file in all_files:
if os.path.isdir(each_file):
type_dict.setdefault('文件夹', 0)
type_dict['文件夹'] += 1
else:
ext = os.path.splitext(each_file)
type_dict.setdefault(ext, 0)
type_dict += 1
for each_type in type_dict.keys():
print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict))
运行结果正确:
该文件夹下共有类型为【.txt】的文件 6 个
该文件夹下共有类型为【.py】的文件 56 个
该文件夹下共有类型为【文件夹】的文件 2 个
该文件夹下共有类型为【.zip】的文件 1 个
2.但是我做了一个小改动,是判断上一路径
代码:
import os
all_files = os.listdir(os.pardir) # 使用os.curdir表示当前目录更标准
type_dict = dict()
for each_file in all_files:
if os.path.isdir(each_file):
type_dict.setdefault('文件夹', 0)
type_dict['文件夹'] += 1
else:
ext = os.path.splitext(each_file)
type_dict.setdefault(ext, 0)
type_dict += 1
for each_type in type_dict.keys():
print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict))
运行结果:
该文件夹下共有类型为【】的文件 9 个
该文件夹下共有类型为【.txt】的文件 2 个
该文件夹下共有类型为【.exe】的文件 2 个
该文件夹下共有类型为【.dll】的文件 4 个
问题:为什么文件夹几个字没有显示出来。
问题出在这一句:os.path.isdir(each_file)
os.listdir(os.pardir) 只拿到了上一级目录里的“名字”,例如 'abc'。但 os.path.isdir('abc') 检查的是“当前目录”下有没有 'abc' 这个文件夹,而不是“上一级目录”下。
所以上一级目录里的文件夹没有被识别成文件夹,全部进入了 else 分支。文件夹一般没有扩展名,经过 os.path.splitext 后扩展名是空字符串 '',于是就被统计成了【】。
正确做法是:判断上一级目录时,要把文件名和 os.pardir 拼接起来再判断。
import os
all_files = os.listdir(os.pardir)
type_dict = dict()
for each_file in all_files:
full_path = os.path.join(os.pardir, each_file)
if os.path.isdir(full_path):
type_dict.setdefault('文件夹', 0)
type_dict['文件夹'] += 1
else:
ext = os.path.splitext(each_file)
type_dict.setdefault(ext, 0)
type_dict += 1
for each_type in type_dict:
print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict))
另外提醒一下:你贴的代码里 type_dict += 1 其实是会报错的,正确写法应该是 type_dict['文件夹'] += 1 或 type_dict += 1。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-9-12 10:46
问题出在这一句:os.path.isdir(each_file)
os.listdir(os.pardir) 只拿到了上一级目录里的“名字”,例 ...
听不懂 贝尔0703 发表于 2026-09-12 16:09
FishC 发表于 2026-9-12 10:46
问题出在这一句:os.p ...
简单说:
os.listdir(os.pardir) 只是拿到了上一级目录里的“名字”,比如 'abc'。
但 os.path.isdir(each_file) 检查的是“当前目录”下有没有 'abc' 这个文件夹。
所以上一级目录里的文件夹,程序没去上一级找,就没认出来。
打个比方:
妈妈让你数隔壁房间有几个盒子。她只告诉你盒子叫“工具箱”。
你检查“工具箱是不是盒子”时,却在自己房间找“工具箱”,当然找不到。
你应该去“隔壁房间/工具箱”那里找。
改法:
把 os.path.isdir(each_file) 改成
os.path.isdir(os.path.join(os.pardir, each_file))
完整代码:
import os
all_files = os.listdir(os.pardir)
type_dict = dict()
for each_file in all_files:
full_path = os.path.join(os.pardir, each_file)
if os.path.isdir(full_path):
type_dict.setdefault('文件夹', 0)
type_dict['文件夹'] += 1
else:
ext = os.path.splitext(each_file)
type_dict.setdefault(ext, 0)
type_dict += 1
for each_type in type_dict:
print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict))
这样上一级目录里的文件夹就会被正确识别成【文件夹】,不会再显示成【】了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-9-12 10:46
问题出在这一句:os.path.isdir(each_file)
os.listdir(os.pardir) 只拿到了上一级目录里的“名字”,例 ...
明白了。 我夏天的到来 发表于 2026-09-12 16:34
FishC 发表于 2026-9-12 10:46
问题出在这一句:os.p ...
明白了就好!关键点记住:os.listdir() 返回的只是名字,判断类型时要带上目录前缀,比如 os.path.join(os.pardir, each_file)。继续加油~
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 贝尔0703 发表于 2026-9-12 16:09
听不懂
举个例子:如果只管文件夹,其他不管,假设C盘下有名为A和B的两个文件夹,A里面有名为B的文件夹,如果当前默认目录(就是你这段程序.py保存的地方)为C:\A\B,那么出来的答案就是【文件夹】为1个(就是B文件夹)。此时如果使用.pardir(上一目录),那么出来的答案就是【文件夹】为1个,【】为1个,因为上一目录是C:/,里面A和B,而对比的时候,是与当前默认目录对比,即与C:/A里面对比,这里面只有B,故而是【文件夹】为1个(B文件夹),【】为1个。如果C:/A中没有B,那一对比,就连个都为【】。 我夏天的到来 发表于 2026-09-12 16:40
贝尔0703 发表于 2026-9-12 16:09
听不懂
举个例子 ...
你的理解基本到位了,核心就是一句话:**os.path.isdir 是在当前工作目录下找,不是在 os.listdir 列出的那个目录下找。**
不过有个小地方要修正一下。
你的例子:
- C:\ 下有 A 和 B
- C:\A 下有 B,所以 C:\A\B 存在
- .py 文件保存在 C:\A\B
此时:
- os.curdir = C:\A\B,列出的是 **C:\A\B 里面**的东西(不是 B 文件夹本身)
- os.pardir = C:\A,列出的是 **C:\A 里面**的东西(即 B)
所以:
用 os.pardir 但没加 join 时:
- os.listdir(os.pardir) 拿到 'B'
- os.path.isdir('B') 实际去查 C:\A\B\B,不存在 → 当成非文件夹
- 没有扩展名 → 扩展名是 '' → 归到【】,1 个
用 os.pardir 且加了 join 时:
- os.path.isdir(os.path.join(os.pardir, 'B')) → 查 C:\A\B → 是文件夹 → 【文件夹】1 个
至于用 os.curdir 的情况,列出的是 C:\A\B 里面的东西,跟 B 文件夹本身没关系,里面有几个文件夹就数几个。
所以你总结的“【文件夹】1 个、【】1 个”是加了 join 之后才会出现的对照结果,没加 join 就只有【】1 个。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-9-12 16:09
简单说:
os.listdir(os.pardir) 只是拿到了上一级目录里的“名字”,比如 'abc'。
明白了 贝尔0703 发表于 2026-09-13 15:00
FishC 发表于 2026-9-12 16:09
简单说:
os.listd ...
很好!
关键就一句话:
os.listdir() 只给你“名字”,要判断它到底是文件还是文件夹,得先把路径拼完整,再用 os.path.isdir() 去判断。
记住这个,以后遇到类似路径问题就不容易错了。继续加油!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 我夏天的到来 发表于 2026-9-12 16:40
举个例子:如果只管文件夹,其他不管,假设C盘下有名为A和B的两个文件夹,A里面有名为B的文件夹,如果当 ...
超感谢!!!!!!
页:
[1]