一个文件夹中有部分文件需要重命名,需要重命名的文件特征是在两个_符号之间。
需要重命名的文件名称在表格文件中peppapig.xls,要先判断文件夹中的文件名中间部分是否和表格文件中标题名中的英文标题是否相符。
在ChatGPT中键入提示词如下:
你是一个Python编程专家,要完成一个文件重命名的任务。具体步骤如下:
本地电脑“E:\7”这个文件夹下有很多mp4文件 ;
读取本地电脑“E:\7”这个文件夹下的peppapig.xls,获取第1列第1行到第1列第39行中的所有单元格内容,提取单元格内容中的英文字符,设为变量season7peppapigname,比如从“49.Kiddie Workout 儿童健身”提取出“Kiddie Workout”,打印出所有season7peppapigname的内容;
获取文件夹中所有mp4文件的文件标题名,截取文件标题名中第一个“_ ”和第二个“_ ”中间的字符,设为变量peppapigname,比如将Peppa Pig _ Winter Games _ Peppa Pig Official _ Family Kids Cartoon.mp4这个文件标题中提取出Winter Games,打印出所有peppapigname的内容;
读取本地电脑“E:\7”这个文件夹下的peppapig.xls,获取第1列第1行到第1列第39行中的所有单元格内容,设为变量realpeppapigname;
如果某个peppapigname和所有season7peppapigname中的某个内容一致(注意:在对比之前,将这两个字符串都转换成小写),那么将这个文件标题名重命名为:【realpeppapigname】.mp4;
注意:每个步骤都要输出相关信息;
在尝试提取 "peppapigname" 之前检查文件名是否包含 "_ ",如果不包含,可以跳过这个文件;
程序运行后,发现没有成功,明明一致的标题,却跳过了。于是反馈给ChatGPT:
处理文件: Peppa Pig _ Hoops _ Peppa Pig Official _ Family Kids Cartoon.mp4
提取到的peppapigname为:Hoops
文件名不在season7peppapigname列表中,跳过.
这个Hoops明显在season7peppapigname列表中,为什么程序运行的过程中却跳过去了?
ChatGPT的回答是:
看来在提取 peppapigname 的过程中可能出现了问题。在你的示例文件名 Peppa Pig _ Hoops _ Peppa Pig Official _ Family Kids Cartoon.mp4 中,peppapigname 是 Hoops,并且它确实是在 season7peppapigname 列表中的。所以,这个问题可能是由于提取 peppapigname 的方式不正确导致的。
当我们使用 split('_ ') 对字符串进行分割的时候,它会返回一个列表,其中包含了被 _ 分割的所有部分。在你的例子中,这个列表应该是 ['Peppa Pig ', 'Hoops ', 'Peppa Pig Official ', 'Family Kids Cartoon.mp4']。
然后,我们使用索引 2 来提取 peppapigname,即 filename.split('_ ')[2]。在我们的列表中,索引 2 对应的是 'Peppa Pig Official ',这就是问题所在。
我们应该使用索引 1 来提取 peppapigname,即 filename.split('_ ')[1]。因为在我们的列表中,索引 1 对应的是 'Hoops '。
此外,你在提取 peppapigname 之后使用了 replace(' ', '').lower() 来删除空格并将字符串转为小写。但是,你的 season7peppapigname 列表中的元素还包含空格,所以我们需要在比较之前也删除这些空格。
所以,我们需要做两个修改:
使用 filename.split('_ ')[1] 来提取 peppapigname。
在比较之前,删除 season7peppapigname 列表中元素的空格。
以下是修改后的代码:
import os
import pandas as pd
import re
# 定义要操作的目录
directory = r"E:\7"
# 定义要读取的Excel文件路径
excel_file = os.path.join(directory, "peppapig.xls")
# 读取Excel文件
df = pd.read_excel(excel_file, usecols=[0], nrows=39, header=None)
# 提取realpeppapigname和season7peppapigname
realpeppapigname = df[0].tolist()
season7peppapigname = [re.sub(r"[^a-zA-Z\s]", "", name).replace(' ', '').lower() for name in realpeppapigname]
# 打印season7peppapigname的内容
print("读取到的season7peppapigname为:")
for name in season7peppapigname:
print(name)
# 遍历文件夹中的所有文件
for filename in os.listdir(directory):
print(f"处理文件: {filename}")
# 判断文件是否为mp4文件
if filename.endswith('.mp4'):
# 检查文件名是否包含 "_ "
if "_ " in filename:
# 截取文件标题名中第一个“_ ”和第二个“_ ”中间的字符
peppapigname = filename.split('_ ')[1]
# 去除提取出的字符中的空格
peppapigname = peppapigname.replace(' ', '').lower()
# 打印peppapigname的内容
print(f"提取到的peppapigname为:{peppapigname}")
# 检查peppapigname是否在season7peppapigname中
if peppapigname in season7peppapigname:
# 获取peppapigname在season7peppapigname中的索引
index = season7peppapigname.index(peppapigname)
new_filename = realpeppapigname[index] + '.mp4'
print(f"重命名文件为: {new_filename}")
os.rename(os.path.join(directory, filename), os.path.join(directory, new_filename))
else:
print("文件名不在season7peppapigname列表中,跳过.")
else:
print("文件名中没有 '_ ',跳过.")
else:
print("文件不是mp4文件,跳过.")
print("处理完成.")
再次运行程序,成功了: