未被驯化的甲鱼 发表于 2020-5-16 15:17:03

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

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: 系统找不到指定的路径。: 'E://hurtworld//appcache\\httpcache\\00\\01'

我个人感觉两段代码逻辑上唯一的区别就是一个先拼接文件路径再判断是文件还是文件夹,另一个是先判断是不是文件再拼接路径。这两种我感觉都可以的啊,为什么会报错呢。。

Twilight6 发表于 2020-5-16 15:47:31

本帖最后由 Twilight6 于 2020-5-16 16:07 编辑

是我太粗心了   {:9_220:}

txxcat 发表于 2020-5-16 15:59:11

    两段代码都没有chdir,所以文件名必须有绝对路径才能正常工作,第一段在isfile之前有这句来拼接路径,只要catalog_name是正确的路径,代码就可以正确运行。
file_path = os.path.join(catatlog_name,file)
   第二段isfile之前没有拼接路径,参数只有文件名本身,除非当前目录正好是path,否者返回都是False,执行了else的语句当做目录递归执行,自然就出错了。

txxcat 发表于 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

Twilight6 发表于 2020-5-16 16:05:02

txxcat 发表于 2020-5-16 16:02


{:9_220:}我又错了 今天错了第三次了感谢指出{:9_220:}

未被驯化的甲鱼 发表于 2020-5-16 16:20:30

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

也就是说,判断是文件夹还是文件必须用完整的路径对吧?
os.path.isfile('完整的路径') √
os.path.isfile('单单一个文件夹或文件名') ×,永远返回false

txxcat 发表于 2020-5-16 16:37:29

未被驯化的甲鱼 发表于 2020-5-16 16:20
也就是说,判断是文件夹还是文件必须用完整的路径对吧?
os.path.isfile('完整的路径') √
os.path.isf ...

不全对,如果是单独的文件名,就会在当前目录下查找,有的话也是True,所以有的代码会先chdir更换工作目录,然后查找就没问题了。
页: [1]
查看完整版本: 大佬们!为什么两端代码同样是递归列出目录下所有文件,一个可以另一个会报错?