鱼C论坛

 找回密码
 立即注册
查看: 5058|回复: 5

[已解决]Python的os和os.path模块第30课课后题问题

[复制链接]
发表于 2017-6-22 11:02:15 | 显示全部楼层 |阅读模式

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

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

x
下图是代码,有大神愿意有空看一下万分感谢!
问题是总是在递归第13行出错,进入到一个文件夹中后就无法进入下一个文件夹了
  1. import os
  2. import os.path

  3. list_move = ['.mp4', '.rmvb', '.avi']
  4. directory = input()
  5. os.chdir(directory)
  6. f = open('vedioList.txt', 'w')
  7. def find_move(direcorty):
  8.        '''
  9.        输入文件夹,找到文件夹内所有后缀为list_move中的文件。
  10.        如果文件夹内包含文件夹,则层级递归遍历所有。
  11.        '''
  12.        for each in os.listdir(directory):
  13.               if os.path.isdir(each):
  14.                      each_1 = directory + '\\' + each
  15.                      os.chdir(each_1)
  16.                      find_move(each_1)#遇到文件夹递归遍历所有文件夹内文件
  17.                      os.chdir(os.pardir)
  18.               else:
  19.                      if os.path.splitext(each)[1] in list_move:
  20.                             print(os.getcwd()+'\\'+each+'\n')
  21.       

  22. find_move(directory)
  23.                            
  24.                            
  25.                      
复制代码
最佳答案
2017-8-1 23:25:59
本帖最后由 status 于 2017-8-1 23:34 编辑

楼主在吗?你这个问题解决了没?没解决的话看下我的,我今天无聊翻帖子看到你的问题,然后把你的问题找到了
首先我稍微的调整了下你的代码位置,然后代码:
  1. import os
  2. f=open(vedioList.txt','w')
  3. list_move = ['.mp4', '.rmvb', '.avi']
  4. def find_move(direcorty):
  5.     '''
  6.     输入文件夹,找到文件夹内所有后缀为list_move中的文件。
  7.     如果文件夹内包含文件夹,则层级递归遍历所有.
  8.     '''
  9.     os.chdir(directory) #这个参数和上面函数的参数拼写不一样
  10.     print(os.getcwd())
  11.     for each in os.listdir(os.curdir):
  12.         if os.path.isdir(each):
  13.             #each_1 = directory + '\\' + each 这两部多余
  14.             #os.chdir(each_1)
  15.             find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  16.             os.chdir(os.pardir)
  17.         if os.path.splitext(each)[1] in list_move:
  18.             f.write(os.getcwd()+os.sep+each+os.linesep)

  19. directory = input('请输入查找范围(路径):')
  20. find_move(directory)
  21. f.close()
  22. print('suessed')#这里只是做程序运行完成后的提示
复制代码

然后测试输出依然报错:
  1. Traceback (most recent call last):
  2.   File "C:/Users/Administrator/Desktop/1.py", line 15, in <module>
  3.     find_move(directory)
  4.   File "C:/Users/Administrator/Desktop/1.py", line 9, in find_move
  5.     find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  6.   File "C:/Users/Administrator/Desktop/1.py", line 9, in find_move
  7.     find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  8.   File "C:/Users/Administrator/Desktop/1.py", line 9, in find_move
  9.     find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  10.   [Previous line repeated 987 more times]
  11.   File "C:/Users/Administrator/Desktop/1.py", line 11, in find_move
  12.     if os.path.splitext(each)[1] in ['.mp4','.rmvb','.avi']:
  13.   File "C:\Program Files\Python36\lib\ntpath.py", line 227, in splitext
  14.     return genericpath._splitext(p, '\\', '/', '.')
  15.   File "C:\Program Files\Python36\lib\genericpath.py", line 127, in _splitext
  16.     sepIndex = max(sepIndex, altsepIndex)
  17. RecursionError: maximum recursion depth exceeded in comparison
复制代码

楼上那朋友给你的代码也只是把递归的默认深度改了,但因为是一直循环下去的,所以没有根本解决
但是看了很多遍语法逻辑都没问题,还是报错,不过我还是终于找到了关键问题:
  1. def find_move(direcorty):#这里
  2.     os.chdir(directory) #这个参数和上面函数的参数拼写不一样
复制代码

其实传进的参数不一样,一般来说是没问题的,但是交互输入时给directory赋值了,也就是输入路径时赋值了,好,print一下看到底是多少,我先给directory赋值为:F:\movies,然后在os.chdir(directory)下一行加入print(os.getcwd()),结果:请输入查找范围(路径):F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
有很长……
我就把它终止了,也就是说,定义函数时参数名和传进参数名不一样是可以的,然后关键就是我们这个程序需要交互赋值并传入参数,而上面结果看出,我们的当前目录永远是我们交互赋值进去的路径,也就是说函数递归永远在一个目录下,遍历进去子目录,os.pardir又回到上一目录也就是【F:\movies】了,然后就这样永远无限循环,进而整个程序无限循环到默认深度停止。

好,我把两个参数名改为相同的,同时print下每次递归的当前目录:
  1. def find_move(directory):#这里
  2.     os.chdir(directory) #现在这两个参数一样了
  3.     print(os.getcwd())
  4. (其他没变)
复制代码

结果:请输入查找范围(路径):F:\movies
F:\movies
F:\movies\电影
suessed
没有任何报错,完美结束,好打开文件并对照路径看看:
F:\movies\谍影重重4.720p.BD中英双字幕.rmvb

F:\movies\谍影重重-cd1.rmvb

F:\movies\谍影重重-cd2.rmvb

F:\movies\谍影重重2-cd1.rmvb

F:\movies\谍影重重2-cd2.rmvb

F:\movies\谍影重重3-cd1.rmvb

F:\movies\谍影重重3-cd2.rmvb

F:\movies\攻壳机动队:崛起2_bd.mp4

F:\movies\攻壳机动队:崛起3_bd.mp4

F:\movies\攻壳机动队:崛起4_bd.mp4

F:\movies\电影\生h危机:f仇_bd.mp4

F:\movies\谍影重重5.mp4

F:\movies\追逐繁星的孩子_bd.mp4

没有问题,也没有重复,由于不能上传图片,就没法给大家对照了,我自己看了是没有遗漏的
答案有点冗长,我只是想把我推理排出错的整个过程展现出来,我不知道我说清楚没有,希望你能理解

这是错误报告

这是错误报告
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-22 11:05:07 | 显示全部楼层
对不起 注释是后添加的 错误报告有问题

这个是新的错误报告

这个是新的错误报告
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-23 17:49:50 | 显示全部楼层
第三行加上
  1. import sys
  2. sys.setrecursionlimit(10000)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-24 16:49:22 | 显示全部楼层

谢谢您的回答!我添加后又出现了栈溢出情况,我不太明白,我之前用类似的代码递归同样的文件夹就没有层级的问题,也没有栈溢出的情况,为什么会出现这种情况呢?如果您方便可以简要解答一下吗?谢谢您
微信截图_20170624164547.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-1 23:25:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 status 于 2017-8-1 23:34 编辑

楼主在吗?你这个问题解决了没?没解决的话看下我的,我今天无聊翻帖子看到你的问题,然后把你的问题找到了
首先我稍微的调整了下你的代码位置,然后代码:
  1. import os
  2. f=open(vedioList.txt','w')
  3. list_move = ['.mp4', '.rmvb', '.avi']
  4. def find_move(direcorty):
  5.     '''
  6.     输入文件夹,找到文件夹内所有后缀为list_move中的文件。
  7.     如果文件夹内包含文件夹,则层级递归遍历所有.
  8.     '''
  9.     os.chdir(directory) #这个参数和上面函数的参数拼写不一样
  10.     print(os.getcwd())
  11.     for each in os.listdir(os.curdir):
  12.         if os.path.isdir(each):
  13.             #each_1 = directory + '\\' + each 这两部多余
  14.             #os.chdir(each_1)
  15.             find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  16.             os.chdir(os.pardir)
  17.         if os.path.splitext(each)[1] in list_move:
  18.             f.write(os.getcwd()+os.sep+each+os.linesep)

  19. directory = input('请输入查找范围(路径):')
  20. find_move(directory)
  21. f.close()
  22. print('suessed')#这里只是做程序运行完成后的提示
复制代码

然后测试输出依然报错:
  1. Traceback (most recent call last):
  2.   File "C:/Users/Administrator/Desktop/1.py", line 15, in <module>
  3.     find_move(directory)
  4.   File "C:/Users/Administrator/Desktop/1.py", line 9, in find_move
  5.     find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  6.   File "C:/Users/Administrator/Desktop/1.py", line 9, in find_move
  7.     find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  8.   File "C:/Users/Administrator/Desktop/1.py", line 9, in find_move
  9.     find_move(each)#遇到文件夹递归遍历所有文件夹内文件
  10.   [Previous line repeated 987 more times]
  11.   File "C:/Users/Administrator/Desktop/1.py", line 11, in find_move
  12.     if os.path.splitext(each)[1] in ['.mp4','.rmvb','.avi']:
  13.   File "C:\Program Files\Python36\lib\ntpath.py", line 227, in splitext
  14.     return genericpath._splitext(p, '\\', '/', '.')
  15.   File "C:\Program Files\Python36\lib\genericpath.py", line 127, in _splitext
  16.     sepIndex = max(sepIndex, altsepIndex)
  17. RecursionError: maximum recursion depth exceeded in comparison
复制代码

楼上那朋友给你的代码也只是把递归的默认深度改了,但因为是一直循环下去的,所以没有根本解决
但是看了很多遍语法逻辑都没问题,还是报错,不过我还是终于找到了关键问题:
  1. def find_move(direcorty):#这里
  2.     os.chdir(directory) #这个参数和上面函数的参数拼写不一样
复制代码

其实传进的参数不一样,一般来说是没问题的,但是交互输入时给directory赋值了,也就是输入路径时赋值了,好,print一下看到底是多少,我先给directory赋值为:F:\movies,然后在os.chdir(directory)下一行加入print(os.getcwd()),结果:请输入查找范围(路径):F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
F:\movies
有很长……
我就把它终止了,也就是说,定义函数时参数名和传进参数名不一样是可以的,然后关键就是我们这个程序需要交互赋值并传入参数,而上面结果看出,我们的当前目录永远是我们交互赋值进去的路径,也就是说函数递归永远在一个目录下,遍历进去子目录,os.pardir又回到上一目录也就是【F:\movies】了,然后就这样永远无限循环,进而整个程序无限循环到默认深度停止。

好,我把两个参数名改为相同的,同时print下每次递归的当前目录:
  1. def find_move(directory):#这里
  2.     os.chdir(directory) #现在这两个参数一样了
  3.     print(os.getcwd())
  4. (其他没变)
复制代码

结果:请输入查找范围(路径):F:\movies
F:\movies
F:\movies\电影
suessed
没有任何报错,完美结束,好打开文件并对照路径看看:
F:\movies\谍影重重4.720p.BD中英双字幕.rmvb

F:\movies\谍影重重-cd1.rmvb

F:\movies\谍影重重-cd2.rmvb

F:\movies\谍影重重2-cd1.rmvb

F:\movies\谍影重重2-cd2.rmvb

F:\movies\谍影重重3-cd1.rmvb

F:\movies\谍影重重3-cd2.rmvb

F:\movies\攻壳机动队:崛起2_bd.mp4

F:\movies\攻壳机动队:崛起3_bd.mp4

F:\movies\攻壳机动队:崛起4_bd.mp4

F:\movies\电影\生h危机:f仇_bd.mp4

F:\movies\谍影重重5.mp4

F:\movies\追逐繁星的孩子_bd.mp4

没有问题,也没有重复,由于不能上传图片,就没法给大家对照了,我自己看了是没有遗漏的
答案有点冗长,我只是想把我推理排出错的整个过程展现出来,我不知道我说清楚没有,希望你能理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-14 19:35:41 | 显示全部楼层
status 发表于 2017-8-1 23:25
楼主在吗?你这个问题解决了没?没解决的话看下我的,我今天无聊翻帖子看到你的问题,然后把你的问题找到了 ...

厉害厉害 佩服 多谢多谢 最近一直没有上号看论坛 回复晚了 非常感谢您的解答 很明白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 16:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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