2-14 作业的问题

2-14 作业的问题

# coding:utf-8

import os

from glob import glob
from shutil import move


def update_filename(path):
    result = glob(path)

    for index, data in enumerate(result):
        path_split = os.path.split(data)
        _format = 'imooc_%s.jpg' % (index+1)
        old_filename = os.path.join(path_split[0], path_split[1])
        new_filename = os.path.join(path_split[0], _format)
        move(old_filename, new_filename)
        

if __name__ == '__main__':
    i_path = os.path.join(os.getcwd(), 'images/*')
    update_filename(i_path)

我想问一下这个作业为什么这段代码执行第一次没问题,再执行一次的话文件夹内的内容就变成这样了?

https://img1.sycdn.imooc.com//climg/646f31d1092a75e304770145.jpg

但如果把这里

 _format = 'imooc_%s.jpg' % (index+1)

改成

_format = 'imooc_%s.jpg' % index

多次执行都没问题,这是什么原因?怎么解决?

正在回答

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

1回答

同学,你好!当执行一次程序后,图片名为imooc_1、imooc_2、imooc_3......

当第二次执行程序时:

索引为0时,old_filename为imooc_1.jpg,new_filename为imooc_1.jpg,图片名称没有改变

当索引为1时,old_filename为imooc_10.jpg,new_filename为imooc_2.jpg,将imooc_10.jpg 改名称为imooc_2.jpg

当索引2时,old_filename为imooc_2.jpg,new_filename为imooc_3.jpg,将imooc_2.jpg 改名称为imooc_3.jpg,此时系统改的是最初imooc_10的图片名称,只不过是经历了两次改名,图片的名称变成了imooc_3.jpg

当索引为3时,old_filename为imooc_3.jpg,new_filename为imooc_4.jpg,将imooc_3.jpg 改名称为imooc_4.jpg,此时系统改的还是之前imooc_10.jpg的图片,只不过经过数次次循环是名称变为了imooc_3.jpg

依次循环imooc_4变成imooc_5.jpg,imooc_5.jpg变成imooc_6,直到变成imooc_10.jpg,其实图片还是第二次循环时imooc_10.jpg的图片,中间图片都被覆盖了


https://img1.sycdn.imooc.com//climg/646f477f09d3ff0313380432.jpg

解决:同学可以用图片名称判断下,如果图片名称为imooc_1.jpg说明已经修改过一次了。终止循环即可

https://img1.sycdn.imooc.com//climg/646f45610923751709940447.jpg

祝学习愉快~


  • 覆盖的这个能理解,但还是没懂为什么重命名时用index+1的时候第二个文件就是获取到imooc_10,用index就不会乱顺序,多次执行都不影响?

    2023-05-26 08:56:28
  • 同学,你好!1、第二次执行文件时,images 文件夹内图片名为imooc_1.jpg、imooc_2.jpg、......。通过glob(path),会获取images 文件夹下的所有图片路径,并且系统是按字符串排序的,如下测试:

    https://img1.sycdn.imooc.com//climg/647010580975413307950286.jpg

    所以获取图片imooc_10.jpg 是排在imooc_1.jpg 后的

    https://img1.sycdn.imooc.com//climg/647010b109923a8518610279.jpg

    2、当用index时,索引为0-9,即imooc_0.jpg到imooc_9.jpg,第二次执行文件时,不是1-10,索引依然是0-9,等同于改的名字和之前的相同,后续图片名称不会被覆盖,所以不影响。

    https://img1.sycdn.imooc.com//climg/647011c0091a7cbf14250683.jpghttps://img1.sycdn.imooc.com//climg/647013c909832cb118740604.jpg

    当用index+1时,第一次运行程序后图片名为imooc_1.jpg到imooc_10.jpg ,第二次执行文件时,获取图片名称是按字符串排序的即E:\\pythonProject\\a310\\images\\imooc_1.jpg、E:\\pythonProject\\a310\\images\\imooc_10.jpg、......。循环第二次imooc_10.jpg 会被改名称为imooc_2.jpg、第三次imooc_2.jpg(其实是最开始imooc_10.jpg)会改名为imooc_3.jpg直到被改名为imooc_10.jpg。从第二次循环到最后十次都是修改的第一次执行程序后的imooc_10.jpg 的图片名称

    https://img1.sycdn.imooc.com//climg/647014dd0954d54a18750684.jpg

    同学,可在设置index、index+1时分别输出下old_filename,new_filename感受下不同

    祝学习愉快~

    2023-05-26 10:11:42
  • 懂了,那这个有什么办法可以解决这个覆盖的问题吗?比如我在修改一次后,怎么把imooc_1~imooc_10在同文件夹下又重命名为imooc_2~imooc_11?

    2023-05-26 12:00:26
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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