鱼C论坛

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

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

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

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

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

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

                
Traceback (most recent call last):
  File "<pyshell#38>", line 3, in <module>
    list_file_range.append(each2[0])
IndexError: list index out of range
编程练习文件夹如下:
[('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
file_range = 'D:/编程练习'
fl = list(os.walk(file_range))
list_file = []
for each2 in range(len(fl)):
    list_file.append(fl[each2][0])
print(list_file)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-6 23:24:01 | 显示全部楼层
list_file_range 在哪里声明了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

额,好像没复制进去
list_file_range = []
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 23:38:29 | 显示全部楼层    本楼为最佳答案   
file_range = 'D:/编程练习'
fl = list(os.walk(file_range))
list_file = []
for each2 in range(len(fl)):
    list_file.append(fl[each2][0])
print(list_file)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-6 23:39:18 | 显示全部楼层
是否可以这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么出错,加上print调式
for each2 in list(os.walk(file_range))[each1]:
                print(each2)
                break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 00:38:23 | 显示全部楼层
你这个算法,外循环中每次用walk遍历一次,然后分别对列表的第0项到第3项的内容迭代,然后加入每次迭代的第一个元素,walk遍历生成的每组数据是由'文件夹名'(字符串),'当前文件夹下的子文件夹名'(列表),'当前文件夹下的文件名'(列表),三样组成的元组,你迭代获取的第一个元素,分别是:文件夹名的第一个字母,在windows里就是所在盘符,当前文件夹列表的第一个文件夹名,当前文件列表的第一个文件名,然后再重复运行3次,最后获得walk遍历的前4组元组数据的三个元素。如果这是你需要的结果,你的错误就在于碰到文件夹下没文件,或者当前没有子文件夹了,就会有空列表[],那么空列表each2.(0)就报out of range的错误了。避免这个错误的方法加入判断,发现是空列表就忽略或者进行你要的其他处理:
import os
list_file_range=[]
file_range = 'D:/编程练习'
for each1 in range(4):
    b=list(os.walk(file_range))
    for each2 in b[each1]:
        if each2:    如果列表不为空,就append
            list_file_range.append(each2[0])
print(list_file)
不过你最好能把这个代码的目的列出来,这样我们才能根据目的而写出正确的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


根据你的最早的代码分析了半天,原来更新了,你就是要获得包括当前文件夹下的所有文件夹名吧?这样避开了空列表的陷阱,基本上运行没问题了,但是可以优化一下,walk对象可以直接迭代,不用转换成列表:
import os
file_range = 'D:/编程练习'
list_file = []
for each2 in os.walk(file_range):
        list_file.append(each2[0])
print(list_file)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

walk对象本身就是迭代的呀?没有想到这个问题,学习啦~~~~
想知道小甲鱼最近在做啥?请访问 -> 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:/编程练习中的所有路径,都是字符串,应该不是空列表的问题吧
至于全部的代码是我的疏忽
import os
file_range = input('请输入带查找的初始目录:')
while (not os.path.isdir(file_range)):
    file_range = input('您输入的目录不存在,请重新输入:')
file = input('请输入需要查找的目标文件:')
list_file_range = []
for each1 in range(len(file_range)):
    for each2 in list(os.walk(file_range))[each1]:
        list_file_range.append(each2[0])
count2 = 0
for each1 in list_file_range:
    for each2 in list(os.walk(file_range))[count2][2]:
        if each2 == file:
            print(each1+'\\'+each2)
    count2 += 1
这是小甲鱼的课后作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

确实是数组引索超出范围的原因,但我看着我的代码感觉好像不应该出现超出引索范围的错误的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 17:57:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-7 17:58:40 | 显示全部楼层
这是改完后的代码:
import os
file_range = input('请输入带查找的初始目录:')
while (not os.path.isdir(file_range)):
    file_range = input('您输入的目录不存在,请重新输入:')
file = input('请输入需要查找的目标文件:')
list_file_range = []
for each1 in list(os.walk(file_range)):
        list_file_range.append(each1[0])
count2 = 0
for each1 in list_file_range:
    for each2 in list(os.walk(file_range))[count2][2]:
        if each2 == file:
            print(each1+'\\'+each2)
    count2 += 1
虽然阔以了,但还是没看懂我上个代码有啥错
想知道小甲鱼最近在做啥?请访问 -> 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'])]
空列表是报错的原因!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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