为了按顺序修改文件名称,采用对【文件名称列表】进行排序的方法。
要对列表进行排序,这里使用列表的sort()方法。这个方法会在不创建新的列表的情况下直接对列表进行排序。
逆序排列:sort(reverse=True)
files.sort()
结果还是不理想:
'1998.png', '1999.png', '2.png', '20.png', '200.png', '2000.png'
并非按照自然数的大小来排序。
推测原因是文件名称带有文件格式的后缀:.png
于是,使用os.path.splitext()
函数获取每个文件名称的文件名部分,即去掉后缀的部分。
os.path.splitext()
函数返回一个元组,第一个元素是文件名部分,第二个元素是文件后缀部分。
通过取第一个元素,即可获取去掉后缀的文件名部分。
# 获取每个文件名称的文件名部分
file_name_list = [os.path.splitext(file_name)[0] for file_name in files]
# 排序
file_name_list.sort()
print(file_name_list)
结果仍是出乎意料:
'1', '10', '100', '1000', '1001', '1002', '1003', '1004', '1005', '1006', '1007', '1008', '1009', '101', '1010', '1011', '1012'
观察输出结果,猜测是文件名称是字符串的缘故。
再把文件名称转为数字。
不用int()函数是因为有的文件名称是'259.1'
这种形式。
会提示出错:ValueError: invalid literal for int() with base 10: '259.1'
即:这是一个错误信息,提示在将字符串’259.1’转换为整数时出现了错误,因为该字符串不是一个有效的十进制数字。
# 转为数字
file_name_list = [float(i) for i in file_name_list]
file_name_list.sort()
print(file_name_list)
换种方式:
def transform(i):
"""
说明:字符串第一位小数是数字,将其转换为整数,否则将其转换为小数。
"""
i = float(i)
if i == int(i):
i = int(i)
else:
i = float(i)
return i
# 转为数字
file_name_list = [transform(i) for i in file_name_list]
# 排序
file_name_list.sort()
# 再转回字符串
file_name_list = [str(i) + '.png' for i in file_name_list]
print(file_name_list)
这就可以了。
修改文件名称:
# 修改文件名称
# enumerate()返回可迭代对象中的元素及其对应的索引值
for index, picture in enumerate(file_name_list):
# 旧名称
old = os.path.join(path, picture)
# 新名称
new = picture.replace(picture, '红楼梦' + str(index + 1) + '.png')
# 加上路径
new = os.path.join(path, new)
# 开始修改文件名称
os.rename(old, new)
print(len(file_name_list))
print('运行完毕')
全部代码如下:
import os
path = 'G:\漫画\红楼梦'
files = os.listdir(path)
# 获取每个文件名称的文件名部分
file_name_list = [os.path.splitext(file_name)[0] for file_name in files]
def transform(i):
"""
说明:字符串第一位小数是数字,将其转换为整数,否则将其转换为小数。
"""
i = float(i)
if i == int(i):
i = int(i)
else:
i = float(i)
return i
# 转为数字
file_name_list = [transform(i) for i in file_name_list]
# 排序
file_name_list.sort()
# 再转回字符串
file_name_list = [str(i) + '.png' for i in file_name_list]
print(file_name_list)
# 修改文件名称
# enumerate()返回可迭代对象中的元素及其对应的索引值
for index, picture in enumerate(file_name_list):
# 旧名称
old = os.path.join(path, picture)
# 新名称
new = picture.replace(picture, '红楼梦' + str(index + 1) + '.png')
# 加上路径
new = os.path.join(path, new)
# 开始修改文件名称
os.rename(old, new)
print(len(file_name_list))
print('运行完毕')