鱼C论坛

 找回密码
 立即注册
查看: 1080|回复: 6

[已解决]大佬们!为什么两端代码同样是递归列出目录下所有文件,一个可以另一个会报错?

[复制链接]
发表于 2020-5-16 15:17:03 | 显示全部楼层 |阅读模式

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

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

x
def list_files(catatlog_name):
    all_catatlog_files = os.listdir(catatlog_name)
    for file in all_catatlog_files:
        file_path = os.path.join(catatlog_name,file)
        if os.path.isfile(file_path):#如果这个拼凑路径是文件,那么添加到库
            file_stock.append(file_path)
        else:
            list_files(file_path)
    return file_stock
后面还有代码但是无关省略了


上面这段是可以成功运行达到目的
但下面这段就不行了,会报错
def find_files(path):
    catatlog = os.listdir(path)
    for each_file in catatlog:
        if os.path.isfile(each_file):
            stock_files.append(os.path.join(path,each_file))
        else:
            path = os.path.join(path,each_file)
            find_files(path)
    return stock_files
后面还有代码但是无关省略了
报错:
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'E://hurtworld//appcache\\httpcache\\00\\01'

我个人感觉两段代码逻辑上唯一的区别就是一个先拼接文件路径再判断是文件还是文件夹,另一个是先判断是不是文件再拼接路径。这两种我感觉都可以的啊,为什么会报错呢。。
最佳答案
2020-5-16 16:37:29
未被驯化的甲鱼 发表于 2020-5-16 16:20
也就是说,判断是文件夹还是文件必须用完整的路径对吧?
os.path.isfile('完整的路径') √
os.path.isf ...

不全对,如果是单独的文件名,就会在当前目录下查找,有的话也是True,所以有的代码会先chdir更换工作目录,然后查找就没问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-16 15:47:31 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-16 16:07 编辑

是我太粗心了   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-16 15:59:11 | 显示全部楼层
    两段代码都没有chdir,所以文件名必须有绝对路径才能正常工作,第一段在isfile之前有这句来拼接路径,只要catalog_name是正确的路径,代码就可以正确运行。
file_path = os.path.join(catatlog_name,file)
   第二段isfile之前没有拼接路径,参数只有文件名本身,除非当前目录正好是path,否者返回都是False,执行了else的语句当做目录递归执行,自然就出错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-16 16:02:34 | 显示全部楼层
本帖最后由 txxcat 于 2020-5-16 16:04 编辑
Twilight6 发表于 2020-5-16 15:47
哎呀,你太粗心了,一下用 \   一下用 /   神仙也救不了....

路径改成这样就好,和你代码完全没有关系~{ ...


实际上,在没有r的情况下,'\\','//','/'是可以混用的,有r的情况下,加上'\',四种情况都可以混用。
>>> os.path.isfile(r'd:\python\1.txt')
True
>>> os.path.isfile('d:\\python\\1.txt')
True
>>> os.path.isfile('d:/python\\1.txt')
True
>>> os.path.isfile('d://python\\1.txt')
True
>>> os.path.isfile('d://python//1.txt')
True
>>> os.path.isfile('d://python\1.txt')
False
>>> os.path.isfile(r'd://python\1.txt')
True
>>> os.path.isfile(r'd:\\python\1.txt')
True
>>> os.path.isfile(r'd:\\python/1.txt')
True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-16 16:05:02 | 显示全部楼层

  我又错了 今天错了第三次了  感谢指出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-16 16:20:30 | 显示全部楼层
txxcat 发表于 2020-5-16 15:59
两段代码都没有chdir,所以文件名必须有绝对路径才能正常工作,第一段在isfile之前有这句来拼接路径, ...

也就是说,判断是文件夹还是文件必须用完整的路径对吧?
os.path.isfile('完整的路径') √
os.path.isfile('单单一个文件夹或文件名') ×,永远返回false
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-16 16:37:29 | 显示全部楼层    本楼为最佳答案   
未被驯化的甲鱼 发表于 2020-5-16 16:20
也就是说,判断是文件夹还是文件必须用完整的路径对吧?
os.path.isfile('完整的路径') √
os.path.isf ...

不全对,如果是单独的文件名,就会在当前目录下查找,有的话也是True,所以有的代码会先chdir更换工作目录,然后查找就没问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-14 19:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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