练习3代码执行过程中报错

练习3代码执行过程中报错

#清理重复的文件
#基本一切条件都不知道

import glob

data={}
#data = {'name': {'path/name': 'content', 'path2/name': 'content'}}

def clear(path):
result=glob.glob(path)

for _data in result:
if glob.os.path.isdir(_data):
_path=glob.os.path.join(_data,'*')
clear(_path)
else:
name=glob.os.path.split(_data[-1]) #提取文件名
try:
f=open(_data,'r')
content=f.read() #读取文件内容
except:
print(f"{_data} is unreadable")
else:
if name in data:
sub_data=data[name] #获取文件名下的二级信息

is_deleted=False
for k,v in sub_data.items():
if v == content: #比较文件的内容
glob.os.remove(_data)
print(f"{_data} will be deleted")
is_deleted=True
if not is_deleted:
data[name][_data] = content
else:
data[name]={
_data:content
}

finally:
f.close()


path=glob.os.path.join(glob.os.getcwd(),'*')
clear(path)
print(data)

http://img1.sycdn.imooc.com//climg/611cc46f09fcc2c223920586.jpg

data执行的结果没有像课堂上那样返回data字典,而是在删除文件的过程中疑似导致字典的items迭代出错。

求解决方法

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!报错原因是运行时错误:字典在迭代过程中改变了大小,同学的代码有以下两个问题:

1、在提取文件名时,[-1]应放在glob.os.path.split(_data)后面,可以使用print()输出查看,可参考下图的代码

http://img1.sycdn.imooc.com//climg/611cd397091bf85407310381.jpg

2、在try...except...else语句中,else代码下的for循环语句应该和if语句在同一层次下,如下图

http://img1.sycdn.imooc.com//climg/611cd4d20966510a06350431.jpg

祝学习愉快!

  • 坻屿 提问者 #1

    http://img1.sycdn.imooc.com//climg/611cdb3309b8b71b24561204.jpg

    按提示修改之后出现新的报错

    2021-08-18 18:04:57
  • 好帮手慕念 回复 提问者 坻屿 #2

    同学,你好,检查一下是否按老师提示的第1点进行修改,在提取文件名时,[-1]应放在glob.os.path.split(_data)后面,如下图

    http://img1.sycdn.imooc.com//climg/611cdeef09e3824106090104.jpg

    祝学习愉快!

    2021-08-18 18:30:44
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师