鱼C论坛

 找回密码
 立即注册
查看: 2553|回复: 15

[已解决]文件遍历与递归的一个问题,请大神给予指导

[复制链接]
发表于 2017-3-7 17:32:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jasonli_whu 于 2017-3-7 18:23 编辑

自己写了一个递归函数,希望将一个文件夹中的所有文件取出遍历出来,放在一个列表中,请各位大神看看,问题出在哪里了
import os

a = []
def find_files(file):

    if os.path.isfile(file):
        a.append(file)
        return a
    else:
        for each in os.listdir(file):
            find_files(os.path.join(file, each))

find_files()是主函数,判断,若不是文件名,是路径名,就递归调用find_files函数
问题:使用函数的时候,print(find_files("随便输入一个路径"))打印出的是None,而不是我想的包含所有文件名的列表 微信截图_20170307182213.png
最佳答案
2017-3-7 18:17:25
本帖最后由 int2str 于 2017-3-7 18:18 编辑

在程序中加入必要的提示字符,有助了解函数调用过程!!!
  1. import os

  2. def find_files(file):
  3.         if os.path.isfile(file):
  4.             a.append(file)
  5.         else:
  6.                 print(file, '是文件夹')
  7.                 for each in os.listdir(file):
  8.                         print('内容:', each)
  9.                         find_files(os.path.join(file, each))
  10.         

  11. file = 'F:\\123'
  12. global a
  13. a = []
  14. find_files(file)
  15. print(a)
复制代码

QQ图片20170307181710.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-3-8 10:11:42 | 显示全部楼层
学习到了,看到楼主遇到的问题,和大家回复的,学习到了两点:
1,在变量的调用的时候,如果函数中调用了外部的变量,那么应该把变量申明为全局变量。
2,在学习阶段,多把结果打印出来添加相应提示符,有助于了解函数调用过程。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 21:53:03 | 显示全部楼层
int2str 发表于 2017-3-7 21:41
在Pycharm可以打印出来呀....是不是不支持中文字符呢?开头加# -*-coding:gbk-*-

a.append()已经修改了a ...

多谢指点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 21:51:34 | 显示全部楼层
591821661 发表于 2017-3-7 19:44
贴主,告诉你一个强大的,os.walk() 省去递归了

多谢多谢,我来看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 21:41:13 | 显示全部楼层
本帖最后由 int2str 于 2017-3-7 21:42 编辑

在Pycharm可以打印出来呀....是不是不支持中文字符呢?开头加# -*-coding:gbk-*-
QQ图片20170307213529.png
a.append()已经修改了a的值,没有必要调用return(个人看法)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 19:44:35 | 显示全部楼层
jasonli_whu 发表于 2017-3-7 18:48
还有请问,为什么您的if代码后不将a 的结果return(像我的代码段中的一样)

贴主,告诉你一个强大的,os.walk() 省去递归了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-3-7 18:48:47 | 显示全部楼层
int2str 发表于 2017-3-7 18:17
在程序中加入必要的提示字符,有助了解函数调用过程!!!

还有请问,为什么您的if代码后不将a 的结果return(像我的代码段中的一样)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 18:40:50 | 显示全部楼层
int2str 发表于 2017-3-7 18:17
在程序中加入必要的提示字符,有助了解函数调用过程!!!

请问,为什么,我用这个正确的代码在pycharm 打印不出结果呢,但是在python自带的shell中可以得到结果呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 18:17:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 int2str 于 2017-3-7 18:18 编辑

在程序中加入必要的提示字符,有助了解函数调用过程!!!
  1. import os

  2. def find_files(file):
  3.         if os.path.isfile(file):
  4.             a.append(file)
  5.         else:
  6.                 print(file, '是文件夹')
  7.                 for each in os.listdir(file):
  8.                         print('内容:', each)
  9.                         find_files(os.path.join(file, each))
  10.         

  11. file = 'F:\\123'
  12. global a
  13. a = []
  14. find_files(file)
  15. print(a)
复制代码

QQ图片20170307181710.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 18:09:39 | 显示全部楼层
本帖最后由 lumber2388779 于 2017-3-7 18:12 编辑
jasonli_whu 发表于 2017-3-7 18:06
改成这样打印的还是None
a = []
def find_files(file):


a = []

函数中声明下global a 如果有问题在函数外部修改成global a=[]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 18:09:33 | 显示全部楼层
你每次递归把a = [],之前的路径都没保存下来。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-3-7 18:06:16 | 显示全部楼层
lumber2388779 发表于 2017-3-7 17:42
你的问题是不是你的a到最后并没有保存你输入文件夹下所有文件
如果是的话是因为你的a[]是局部变量 每次递 ...

改成这样打印的还是None
a = []
def find_files(file):
    if os.path.isfile(file):
        a.append(file)
        return a
    else:
        for each in os.listdir(file):
            find_files(os.path.join(file, each))
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 18:04:20 | 显示全部楼层
lumber2388779 发表于 2017-3-7 17:42
你的问题是不是你的a到最后并没有保存你输入文件夹下所有文件
如果是的话是因为你的a[]是局部变量 每次递 ...

自己怎么看都不觉得有问题,你一说我就大明白了,我先改改看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 17:42:47 | 显示全部楼层
你的问题是不是你的a到最后并没有保存你输入文件夹下所有文件
如果是的话是因为你的a[]是局部变量 每次递归都重新创建一个a[]
只要把a[]作为全局变量就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-7 17:41:57 | 显示全部楼层
newu 发表于 2017-3-7 17:35
可以明确下问题吗?

请在看一下,我修改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 17:35:15 | 显示全部楼层
可以明确下问题吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-2 07:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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