利用Python按数字顺序批量修改文件名称

为了按顺序修改文件名称,采用对【文件名称列表】进行排序的方法。

要对列表进行排序,这里使用列表的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('运行完毕')

利用Python按数字顺序批量修改文件名称_第1张图片

全部代码如下:

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('运行完毕')

你可能感兴趣的:(python使用经验,python,算法,开发语言)