鱼C论坛

 找回密码
 立即注册
查看: 849|回复: 13

[已解决]python代码报错原因不明

[复制链接]
发表于 2020-4-6 23:06:18 | 显示全部楼层 |阅读模式

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

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

x

  1. file_range = 'D:/编程练习'
  2. for each1 in range(4):
  3.         for each2 in list(os.walk(file_range))[each1]:
  4.                 list_file_range.append(each2[0])

  5.                
  6. Traceback (most recent call last):
  7.   File "<pyshell#38>", line 3, in <module>
  8.     list_file_range.append(each2[0])
  9. IndexError: list index out of range
复制代码

编程练习文件夹如下:
  1. [('D:\\编程练习', ['A', 'B'], ['ascll值对照表.png', 'test.py', 'test.txt', 'test1.txt', 'test2.txt', '回答问题(输入地板大小、方块数量的两个因数,求方块数量).py', '字符串.png', '字符串的方法及注释(1).png', '字符串的方法及注释(2).png', '密码安全检测.py', '小游戏(迫害).py', '文件的打开模式和文件对象方法.png', '课后作业(字典,第25讲,动动手第0题).py', '课后作业(字典,第26讲,动动手第0题).py', '课后作业(字符串:格式化).py', '课后作业(序列!序列!).py', '课后作业(文件系统,第30讲,动动手第0题).py', '课后作业(文件系统,第30讲,动动手第1题).py', '课后作业(文件系统,第30讲,动动手第2题).py', '课后作业(文件,第29讲,动动手第0题).py', '课后作业(文件,第29讲,动动手第1题).py', '课后作业(文件,第29讲,动动手第2题).py', '课后作业(文件,第29讲,动动手第3题).py', '课后作业(文件,第29讲,动动手第4题).py', '课后作业(递归23,24讲第0题).py', '课后作业(递归23,24讲第1题).py', '课后作业(递归23,24讲第2题).py', '课后作业(递归23,24讲第3题).py', '随便玩玩.py', '集合方法.png']), ('D:\\编程练习\\A', ['C'], []), ('D:\\编程练习\\A\\C', [], ['B.txt']), ('D:\\编程练习\\B', [], ['B.txt'])]
复制代码
最佳答案
2020-4-6 23:38:29
  1. file_range = 'D:/编程练习'
  2. fl = list(os.walk(file_range))
  3. list_file = []
  4. for each2 in range(len(fl)):
  5.     list_file.append(fl[each2][0])
  6. print(list_file)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-6 23:24:01 | 显示全部楼层
list_file_range 在哪里声明了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-6 23:32:58 | 显示全部楼层
ba21 发表于 2020-4-6 23:24
list_file_range 在哪里声明了?

额,好像没复制进去
list_file_range = []
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 23:38:29 | 显示全部楼层    本楼为最佳答案   
  1. file_range = 'D:/编程练习'
  2. fl = list(os.walk(file_range))
  3. list_file = []
  4. for each2 in range(len(fl)):
  5.     list_file.append(fl[each2][0])
  6. print(list_file)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 23:39:18 | 显示全部楼层
是否可以这样?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 23:42:06 | 显示全部楼层
问问题把代码上全。提示一句加一句。

为什么出错,加上print调式
for each2 in list(os.walk(file_range))[each1]:
                print(each2)
                break
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 00:38:23 | 显示全部楼层
你这个算法,外循环中每次用walk遍历一次,然后分别对列表的第0项到第3项的内容迭代,然后加入每次迭代的第一个元素,walk遍历生成的每组数据是由'文件夹名'(字符串),'当前文件夹下的子文件夹名'(列表),'当前文件夹下的文件名'(列表),三样组成的元组,你迭代获取的第一个元素,分别是:文件夹名的第一个字母,在windows里就是所在盘符,当前文件夹列表的第一个文件夹名,当前文件列表的第一个文件名,然后再重复运行3次,最后获得walk遍历的前4组元组数据的三个元素。如果这是你需要的结果,你的错误就在于碰到文件夹下没文件,或者当前没有子文件夹了,就会有空列表[],那么空列表each2.(0)就报out of range的错误了。避免这个错误的方法加入判断,发现是空列表就忽略或者进行你要的其他处理:
  1. import os
  2. list_file_range=[]
  3. file_range = 'D:/编程练习'
  4. for each1 in range(4):
  5.     b=list(os.walk(file_range))
  6.     for each2 in b[each1]:
  7.         if each2:    如果列表不为空,就append
  8.             list_file_range.append(each2[0])
  9. print(list_file)
复制代码

不过你最好能把这个代码的目的列出来,这样我们才能根据目的而写出正确的代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 00:56:08 | 显示全部楼层


根据你的最早的代码分析了半天,原来更新了,你就是要获得包括当前文件夹下的所有文件夹名吧?这样避开了空列表的陷阱,基本上运行没问题了,但是可以优化一下,walk对象可以直接迭代,不用转换成列表:
  1. import os
  2. file_range = 'D:/编程练习'
  3. list_file = []
  4. for each2 in os.walk(file_range):
  5.         list_file.append(each2[0])
  6. print(list_file)
复制代码

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

使用道具 举报

发表于 2020-4-7 08:30:16 | 显示全部楼层
txxcat 发表于 2020-4-7 00:56
根据你的最早的代码分析了半天,原来更新了,你就是要获得包括当前文件夹下的所有文件夹名吧?这样避开 ...

呵呵,我也是回答问题的人。

看了你的回复,才知道。你真是热心人。这里有您更精彩~~~~~~~~~~~~~~~

另:对于楼主的出错,其实就是数组超范围的问题。

walk对象本身就是迭代的呀?没有想到这个问题,学习啦~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 17:50:48 | 显示全部楼层
txxcat 发表于 2020-4-7 00:38
你这个算法,外循环中每次用walk遍历一次,然后分别对列表的第0项到第3项的内容迭代,然后加入每次迭代的第 ...

额,我这个for循环的目的是为了获取我D:/编程练习中的所有路径,而('D:\\编程练习'),('D:\\编程练习\\A'),('D:\\编程练习\\A\\C'),('D:\\编程练习\\B')这些是我D:/编程练习中的所有路径,都是字符串,应该不是空列表的问题吧
至于全部的代码是我的疏忽
  1. import os
  2. file_range = input('请输入带查找的初始目录:')
  3. while (not os.path.isdir(file_range)):
  4.     file_range = input('您输入的目录不存在,请重新输入:')
  5. file = input('请输入需要查找的目标文件:')
  6. list_file_range = []
  7. for each1 in range(len(file_range)):
  8.     for each2 in list(os.walk(file_range))[each1]:
  9.         list_file_range.append(each2[0])
  10. count2 = 0
  11. for each1 in list_file_range:
  12.     for each2 in list(os.walk(file_range))[count2][2]:
  13.         if each2 == file:
  14.             print(each1+'\\'+each2)
  15.     count2 += 1
复制代码

这是小甲鱼的课后作业
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 17:52:42 | 显示全部楼层
xiangjianshinan 发表于 2020-4-7 08:30
呵呵,我也是回答问题的人。

看了你的回复,才知道。你真是热心人。这里有您更精彩~~~~~~~~~~~~~~~

确实是数组引索超出范围的原因,但我看着我的代码感觉好像不应该出现超出引索范围的错误的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 17:57:28 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 17:58:40 | 显示全部楼层
这是改完后的代码:
  1. import os
  2. file_range = input('请输入带查找的初始目录:')
  3. while (not os.path.isdir(file_range)):
  4.     file_range = input('您输入的目录不存在,请重新输入:')
  5. file = input('请输入需要查找的目标文件:')
  6. list_file_range = []
  7. for each1 in list(os.walk(file_range)):
  8.         list_file_range.append(each1[0])
  9. count2 = 0
  10. for each1 in list_file_range:
  11.     for each2 in list(os.walk(file_range))[count2][2]:
  12.         if each2 == file:
  13.             print(each1+'\\'+each2)
  14.     count2 += 1
复制代码

虽然阔以了,但还是没看懂我上个代码有啥错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 19:03:16 | 显示全部楼层
[('D:\\编程练习', ['A', 'B'], ['ascll值对照表.png', 'test.py', 'test.txt', 'test1.txt', 'test2.txt', '回答问题(输入地板大小、方块数量的两个因数,求方块数量).py', '字符串.png', '字符串的方法及注释(1).png', '字符串的方法及注释(2).png', '密码安全检测.py', '小游戏(迫害).py', '文件的打开模式和文件对象方法.png', '课后作业(字典,第25讲,动动手第0题).py', '课后作业(字典,第26讲,动动手第0题).py', '课后作业(字符串:格式化).py', '课后作业(序列!序列!).py', '课后作业(文件系统,第30讲,动动手第0题).py', '课后作业(文件系统,第30讲,动动手第1题).py', '课后作业(文件系统,第30讲,动动手第2题).py', '课后作业(文件,第29讲,动动手第0题).py', '课后作业(文件,第29讲,动动手第1题).py', '课后作业(文件,第29讲,动动手第2题).py', '课后作业(文件,第29讲,动动手第3题).py', '课后作业(文件,第29讲,动动手第4题).py', '课后作业(递归23,24讲第0题).py', '课后作业(递归23,24讲第1题).py', '课后作业(递归23,24讲第2题).py', '课后作业(递归23,24讲第3题).py', '随便玩玩.py', '集合方法.png']), ('D:\\编程练习\\A', ['C'], []), ('D:\\编程练习\\A\\C', [], ['B.txt']), ('D:\\编程练习\\B', [], ['B.txt'])]
空列表是报错的原因!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 14:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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