鱼C论坛

 找回密码
 立即注册
查看: 30|回复: 10

[已解决]课后30讲显示当前路径下文件夹及各文件数量问题

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如附件是当前路径和上一路径截图。

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)[1]
        type_dict.setdefault(ext, 0)
        type_dict[ext] += 1

for each_type in type_dict.keys():
    print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))
运行结果正确
该文件夹下共有类型为【.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)[1]
        type_dict.setdefault(ext, 0)
        type_dict[ext] += 1

for each_type in type_dict.keys():
    print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))

运行结果:
该文件夹下共有类型为【】的文件 9 个
该文件夹下共有类型为【.txt】的文件 2 个
该文件夹下共有类型为【.exe】的文件 2 个
该文件夹下共有类型为【.dll】的文件 4 个

问题:为什么文件夹几个字没有显示出来。

最佳答案
6 天前
问题出在这一句:os.path.isdir(each_file)

os.listdir(os.pardir) 只拿到了上一级目录里的“名字”,例如 'abc'。但 os.path.isdir('abc') 检查的是“当前目录”下有没有 'abc' 这个文件夹,而不是“上一级目录”下。

所以上一级目录里的文件夹没有被识别成文件夹,全部进入了 else 分支。文件夹一般没有扩展名,经过 os.path.splitext 后扩展名是空字符串 '',于是就被统计成了【】。

正确做法是:判断上一级目录时,要把文件名和 os.pardir 拼接起来再判断。


  1. import os

  2. all_files = os.listdir(os.pardir)
  3. type_dict = dict()

  4. for each_file in all_files:
  5.     full_path = os.path.join(os.pardir, each_file)
  6.     if os.path.isdir(full_path):
  7.         type_dict.setdefault('文件夹', 0)
  8.         type_dict['文件夹'] += 1
  9.     else:
  10.         ext = os.path.splitext(each_file)[1]
  11.         type_dict.setdefault(ext, 0)
  12.         type_dict[ext] += 1

  13. for each_type in type_dict:
  14.     print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))
复制代码


另外提醒一下:你贴的代码里 type_dict += 1 其实是会报错的,正确写法应该是 type_dict['文件夹'] += 1type_dict[ext] += 1

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

当前路径

当前路径

上一路径

上一路径
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层    本楼为最佳答案   
问题出在这一句:os.path.isdir(each_file)

os.listdir(os.pardir) 只拿到了上一级目录里的“名字”,例如 'abc'。但 os.path.isdir('abc') 检查的是“当前目录”下有没有 'abc' 这个文件夹,而不是“上一级目录”下。

所以上一级目录里的文件夹没有被识别成文件夹,全部进入了 else 分支。文件夹一般没有扩展名,经过 os.path.splitext 后扩展名是空字符串 '',于是就被统计成了【】。

正确做法是:判断上一级目录时,要把文件名和 os.pardir 拼接起来再判断。


  1. import os

  2. all_files = os.listdir(os.pardir)
  3. type_dict = dict()

  4. for each_file in all_files:
  5.     full_path = os.path.join(os.pardir, each_file)
  6.     if os.path.isdir(full_path):
  7.         type_dict.setdefault('文件夹', 0)
  8.         type_dict['文件夹'] += 1
  9.     else:
  10.         ext = os.path.splitext(each_file)[1]
  11.         type_dict.setdefault(ext, 0)
  12.         type_dict[ext] += 1

  13. for each_type in type_dict:
  14.     print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))
复制代码


另外提醒一下:你贴的代码里 type_dict += 1 其实是会报错的,正确写法应该是 type_dict['文件夹'] += 1type_dict[ext] += 1

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
FishC 发表于 2026-9-12 10:46
问题出在这一句:os.path.isdir(each_file)

os.listdir(os.pardir) 只拿到了上一级目录里的“名字”,例 ...

听不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
贝尔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))

完整代码:


  1. import os

  2. all_files = os.listdir(os.pardir)
  3. type_dict = dict()

  4. for each_file in all_files:
  5.     full_path = os.path.join(os.pardir, each_file)
  6.     if os.path.isdir(full_path):
  7.         type_dict.setdefault('文件夹', 0)
  8.         type_dict['文件夹'] += 1
  9.     else:
  10.         ext = os.path.splitext(each_file)[1]
  11.         type_dict.setdefault(ext, 0)
  12.         type_dict[ext] += 1

  13. for each_type in type_dict:
  14.     print('该文件夹下共有类型为【%s】的文件 %d 个' % (each_type, type_dict[each_type]))
复制代码


这样上一级目录里的文件夹就会被正确识别成【文件夹】,不会再显示成【】了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
FishC 发表于 2026-9-12 10:46
问题出在这一句:os.path.isdir(each_file)

os.listdir(os.pardir) 只拿到了上一级目录里的“名字”,例 ...

明白了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
我夏天的到来 发表于 2026-09-12 16:34
FishC 发表于 2026-9-12 10:46
问题出在这一句:os.p ...


明白了就好!关键点记住:os.listdir() 返回的只是名字,判断类型时要带上目录前缀,比如 os.path.join(os.pardir, each_file)。继续加油~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层

举个例子:如果只管文件夹,其他不管,假设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,那一对比,就连个都为【】。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
我夏天的到来 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
FishC 发表于 2026-9-12 16:09
简单说:

os.listdir(os.pardir) 只是拿到了上一级目录里的“名字”,比如 'abc'。  

明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
贝尔0703 发表于 2026-09-13 15:00
FishC 发表于 2026-9-12 16:09
简单说:

os.listd ...


很好!

关键就一句话:

os.listdir() 只给你“名字”,要判断它到底是文件还是文件夹,得先把路径拼完整,再用 os.path.isdir() 去判断。

记住这个,以后遇到类似路径问题就不容易错了。继续加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
我夏天的到来 发表于 2026-9-12 16:40
举个例子:如果只管文件夹,其他不管,假设C盘下有名为A和B的两个文件夹,A里面有名为B的文件夹,如果当 ...

超感谢!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-9-18 19:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表