Python文件重命名(编号)

今天收到任务:

大佬: 7-31
这两天相对空闲,咱们要搞个最新版的 XXXX 图集,你截取下吧
可以先从手册中用到的图开始
分XX和XX端
你可以把系统全屏,这样截图出来尺寸一致
图片文件名编号上 0001,0002 搞成四位的,如 0001-首页,0002-系统设置,等等。

我:ヽ( ̄▽ ̄)و

这要是几张也就算了,三四十张不就是体力劳动了吗?突然改一个不得回到解放前。这要是毕业设计那么改不得完蛋。写脚本!得写脚本。

初版修改后(第四版):后面有终版

为啥是修改后,第一版是按照文件创建时间修改,但是我们有顺序要求而且按照创建时间做了排序也不行。第一版是直接读取并修改,第二版是按照文件创建时间进行修改,第三版按照用户自定义列表进行匹配,第四版把用户自定义列表作成配置文件格式(yaml)方便后面修改,还没开始我就预计这种任务很难一次做到满意,会改。

第四版

# coding=utf-8
"""
@project: test
@Author:langlangago
@file: test.py
@date:2023/7/31 18:03
"""
import os
import yaml
# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))

# 修改当前工作目录
os.chdir(current_dir)
# 读取配置文件
with open('config.yaml', 'r', encoding='utf-8') as file:
    config = yaml.safe_load(file)

# 从配置文件中获取文件夹路径和其他参数
folder_path = config['folder_path']
start_number = config['start_number']
prefix_format = config['prefix_format']
user_order = config['user_order']

# 列出文件夹中的所有文件和子文件夹
items = os.listdir(folder_path)

# 过滤掉子文件夹,只保留文件
file_list = [item for item in items if os.path.isfile(os.path.join(folder_path, item))]

# 将文件列表按照用户指定顺序进行排序
sorted_file_list = sorted(file_list, key=lambda x: user_order.index(os.path.splitext(x)[0]))

# 遍历所有文件
for index, file_name in enumerate(sorted_file_list):
    # 计算前缀数字
    prefix_number = start_number + index

    # 拆分文件名和扩展名
    file_name, ext = os.path.splitext(file_name)

    # 构建新的文件名
    new_prefix = prefix_format.format(prefix_number)
    new_file_name = new_prefix + file_name + ext

    # 构建旧的完整文件路径
    old_file_path = os.path.join(folder_path, file_name + ext)

    # 构建新的完整文件路径
    new_file_path = os.path.join(folder_path, new_file_name)

    # 重命名文件
    os.rename(old_file_path, new_file_path)

配置文件:config.yaml

folder_path: D:\XXXX\图集
start_number: 1
prefix_format: '{:04d}-'
user_order:
  - 首页看板
  - XX1
  - XX2
  - XX3
  

终版:

优化了用户列表中有,实际目录中无并提示缺少哪些图片,拆分后缀适用于其他类型的文件修改。

# coding=utf-8
"""
@project: test
@Author:langlangago
@file: main.py
@date:2023/7/31 18:04
"""
import os
import yaml

# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))

# 修改当前工作目录
os.chdir(current_dir)

# 读取配置文件
with open('config.yaml', 'r', encoding='utf-8') as file:
    config = yaml.safe_load(file)

# 从配置文件中获取文件夹路径和其他参数
folder_path = config['folder_path']
start_number = config['start_number']
prefix_format = config['prefix_format']
user_order = config['user_order']

# 列出文件夹中的所有文件和子文件夹
items = os.listdir(folder_path)

# 过滤掉子文件夹,只保留文件
file_list = [item for item in items if os.path.isfile(os.path.join(folder_path, item))]

# 将实际存在的文件转化为列表
existing_files = [os.path.splitext(file_name)[0] for file_name in file_list]
existing_extensions = [os.path.splitext(file_name)[1] for file_name in file_list]

# 将用户定义的文件转化为列表,并添加正确的文件后缀
user_files = [os.path.splitext(file_name)[0] for file_name in user_order]
user_files_with_ext = [file_name + ext for file_name, ext in zip(user_files, existing_extensions)]

# 检查用户定义的文件是否全部存在于文件夹中
missing_files = [file_name for file_name in user_files_with_ext if file_name not in file_list]

# 如果存在缺失的文件,则报错并不执行重命名操作
if missing_files:
    print("用户定义列表中存在但实际目录中不存在的文件:")
    for file_name in missing_files:
        print(file_name)

    # 报错并不执行重命名操作
    raise ValueError("存在缺失的文件,无法执行重命名操作。")
else:
    # 遍历所有文件并进行重命名操作
    for index, file_name in enumerate(user_order):
        # 计算前缀数字
        prefix_number = start_number + index

        # 构建新的文件名
        new_prefix = prefix_format.format(prefix_number)
        new_file_name = new_prefix + file_name + existing_extensions[index]

        # 构建旧的完整文件路径
        old_file_path = os.path.join(folder_path, user_files_with_ext[index])

        # 构建新的完整文件路径
        new_file_path = os.path.join(folder_path, new_file_name)

        # 重命名文件
        os.rename(old_file_path, new_file_path)
        print(f"已将文件 {user_files_with_ext[index]} 重命名为 {new_file_name}")
print("文件重命名完成。")

目录层级:

配置(#`O′)文件中自行修改(配置化的好处,方便打包成 exe)

config.yaml 修改 folder_path: D:\XXXX\图集

效果:

按照需求修改命名规则和文件存放路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值