鱼C论坛

 找回密码
 立即注册
查看: 2196|回复: 9

[已解决]os.prth.isdir在非本py文件所在文件夹下判断失误问题

[复制链接]
发表于 2020-10-24 22:56:54 | 显示全部楼层 |阅读模式

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

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

x
import os
while 1:
    file1 = input("请输入要统计的文件夹路径【按F退出】:")
    differ = []
    file_x = {}
    if file1 != "F":
        file2 = os.listdir(file1)
        for f in file2:
            if os.path.isdir(f):
                differ.append(f)
            else:
                f1 = os.path.splitext(f)[1]
                file_x.setdefault(f1,0)
                file_x[f1] += 1
    print("该文件夹下共有类型为【文件夹】的文件%d个"%len(differ))
    for i in file_x.keys():
        print("该文件夹下共有类型为【%s】的文件%d个"%(i,file_x[i]))
    
    else:
        break
input()
如上这条代码,统计文件夹下的文件类型及其数量,当要判断的文件夹是该py文件纯在的文件夹时,
if os.path.isdir(f):
                differ.append(f)
正常运行。当py文件不在这一文件夹下时统计的文件夹数量为0,对应的会多出一个"该文件夹下共有类型为【】的文件x个"
这是为什么
最佳答案
2020-10-25 09:19:21
灵魂溢出 发表于 2020-10-25 09:06
我就是传入完整的目录,没传完整目录会报错的吧,我不是报错,是他判断出错了

不,你没有
import os

while 1:
    file1 = input("请输入要统计的文件夹路径【按F退出】:")
    differ = []
    file_x = {}
    if file1 != "F":
        # listdir 得到的是文件名、文件夹名列表,不包含路径
        file2 = os.listdir(file1)
        for f in file2:
            # 给isdir传入完整路径参数
            # 此时 f 是文件名, file1 是你输入的文件夹路径
            # 你需要把文件夹路径和文件名拼接成完整路径,作为参数传给 isdir 函数
            if os.path.isdir(os.path.join(file1, f)):
                differ.append(f)
            else:
                f1 = os.path.splitext(f)[1]
                file_x.setdefault(f1, 0)
                file_x[f1] += 1
    print("该文件夹下共有类型为【文件夹】的文件%d个" % len(differ))
    for i in file_x.keys():
        print("该文件夹下共有类型为【%s】的文件%d个" % (i, file_x[i]))

    else:
        break
input()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-24 23:11:12 | 显示全部楼层
加个判断
if os.listdir('你的path') != []:
    do something
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 23:39:11 | 显示全部楼层
本帖最后由 深山小兽 于 2020-10-24 23:44 编辑

可以再把问题描述清楚一点吗?不是很明白你的意思?像这种统计文件夹和文件个数的情况建议用字典会比较好点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 23:51:32 From FishC Mobile | 显示全部楼层
非当前目录的情况下,你要把完整的路径参数传给isdir函数,不能只给文件名,否则它就是在当前目录判断的,会出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-25 09:06:11 | 显示全部楼层
hrp 发表于 2020-10-24 23:51
非当前目录的情况下,你要把完整的路径参数传给isdir函数,不能只给文件名,否则它就是在当前目录判断的, ...

我就是传入完整的目录,没传完整目录会报错的吧,我不是报错,是他判断出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 09:19:21 | 显示全部楼层    本楼为最佳答案   
灵魂溢出 发表于 2020-10-25 09:06
我就是传入完整的目录,没传完整目录会报错的吧,我不是报错,是他判断出错了

不,你没有
import os

while 1:
    file1 = input("请输入要统计的文件夹路径【按F退出】:")
    differ = []
    file_x = {}
    if file1 != "F":
        # listdir 得到的是文件名、文件夹名列表,不包含路径
        file2 = os.listdir(file1)
        for f in file2:
            # 给isdir传入完整路径参数
            # 此时 f 是文件名, file1 是你输入的文件夹路径
            # 你需要把文件夹路径和文件名拼接成完整路径,作为参数传给 isdir 函数
            if os.path.isdir(os.path.join(file1, f)):
                differ.append(f)
            else:
                f1 = os.path.splitext(f)[1]
                file_x.setdefault(f1, 0)
                file_x[f1] += 1
    print("该文件夹下共有类型为【文件夹】的文件%d个" % len(differ))
    for i in file_x.keys():
        print("该文件夹下共有类型为【%s】的文件%d个" % (i, file_x[i]))

    else:
        break
input()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-25 09:20:55 | 显示全部楼层

emmmm,原来问题在这,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 09:47:05 | 显示全部楼层
import os
while 1:
    file1 = input("请输入要统计的文件夹路径【按F退出】:")
    differ = []
    file_x = {}
    if file1 != "F":
        file2 = os.listdir(file1)          # file2只包含文件名和文件夹名,不包含完整路径名
        for f in file2:
            if os.path.isdir(f):            #如果在当前目录下,也就是py文件所在目录下,可以正确判断是否是文件夹,但是如果不在当前目录下,因为不包含完整路径,只会判断为False,会执行else,就出现你说的问题,多了一堆的【】
                differ.append(f)
            else:
                f1 = os.path.splitext(f)[1]
                file_x.setdefault(f1,0)
                file_x[f1] += 1
    print("该文件夹下共有类型为【文件夹】的文件%d个"%len(differ))
    for i in file_x.keys():
        print("该文件夹下共有类型为【%s】的文件%d个"%(i,file_x[i]))
    
    else:
        break
input()
这样改一下就可以了:
import os
while 1:
    file1 = input("请输入要统计的文件夹路径【按F退出】:")
    differ = []
    file_x = {}
    if file1 != "F":
        file2 = os.listdir(file1)
        for f in file2:
            if os.path.isdir(os.path.join(file1,f)):    #转换成完整路径名
                differ.append(f)
            else:
                f1 = os.path.splitext(f)[1]
                file_x.setdefault(f1,0)
                file_x[f1] += 1
        print("该文件夹下共有类型为【文件夹】的文件%d个"%len(differ))
        for i in file_x.keys():
            print("该文件夹下共有类型为【%s】的文件%d个"%(i,file_x[i]))
    
    else:
        break
input()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-25 15:50:03 | 显示全部楼层
txxcat 发表于 2020-10-25 09:47
这样改一下就可以了:

谢谢,上一层楼主已经解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 13:08:50 | 显示全部楼层
本帖最后由 深山小兽 于 2020-10-26 13:10 编辑

来晚了。你还可以通过改变工作目录的方式解决问题,并不需要把路径加进去也能解决。关键点不是路径,而在于工作目录。建议你使用os.chdir("工作目录file1")。昨晚上不知道你问的什么,所以没法回答。
import os
while 1:
    file1 = input("请输入要统计的文件夹路径【按F退出】:")
    os.chdir(file1)# 把这句加进去就能解决代码的问题
    differ = []
    file_x = {}
    if file1 != "F":
        file2 = os.listdir(file1)
        for f in file2:
            if os.path.isdir(f):
                differ.append(f)
            else:
                f1 = os.path.splitext(f)[1]
                file_x.setdefault(f1,0)
                file_x[f1] += 1
    print("该文件夹下共有类型为【文件夹】的文件%d个"%len(differ))
    for i in file_x.keys():
        print("该文件夹下共有类型为【%s】的文件%d个"%(i,file_x[i]))
    
    else:
        break
input()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 04:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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