批量重命名脚本

批量重命名脚本

我正在寻找一个脚本,可以让我批量重命名 jpg/png 文件,从其原始名称为 01.jpg(或 01.png)02.jpg 03.jpg 等等。

提前致谢!

答案1

概述

一个例子Python脚本将任意文件重命名为以零为前导的数字序列。

确保使用最新版本的 Python 3(即Python 3.7.4在撰写本文时,您可能希望.py在安装过程中创建适当的文件关联并将其添加python.exe到您的路径中。

安装 Python 后,您还需要natsort 模块来自 PyPI,用于自然排序(而非字典排序)。你可以使用以下命令安装它:

python -m pip install natsort

笔记

  • 序列总是从零开始。

  • 0 总是用两位或两位以上的数字来表示(例如 00、000 等)。

  • 零仅放置在小于最大位数的数字前面(不包括 1-10 项)。例如:

    • 项目 1-10 变为 00-09
    • 项目 1-100 变为 00-09,然后变为 10-99
    • 项目 1-101 变为 000-099,然后变为 100
    • 项目 1-1001 变为 0000 - 0999 然后是 1000
  • timeprint语句完全是可选的(因此包括在内,但用 注释掉#)。


注意事项

如下配置,此脚本:

  • 默认情况下重命名已关闭。rename=True一旦您确定其按您希望的方式运行,请设置。

  • 仅对调用它的目录进行操作(从不操作子目录)。

  • 查找以.jpg和结尾的文件.png。如果您不想查找这些文件进行重命名,则需要编辑脚本的部分内容。

  • 重命名遇到的文件。这意味着某些图像可能(可能)被重命名,而不是按照其预期顺序。某些情况可以通过自然排序(当前在下面的脚本中实现)来克服。也就是说,如果 Windows 在被要求提供当前目录的内容时返回例如some-jpeg.jpg,则此脚本将重命名这些内容例如、等。作为部分修复,您可以简单地仅使用例如或仅使用 目录中的文件。some-png.png00.jpg01.png.jpg.png

  • 毫无疑问,这个脚本还有许多改进空间。=)


脚本

例如 seq_rename.py

# Rename files to a numerical sequence with leading zeros.

# We use the natsort module (available from PyPI) to provide a natural (rather
# than lexographical) sort of file names.

# https://docs.python.org/3/library/os.html
# https://docs.python.org/3/library/os.path.html

# natsort module
# https://pypi.org/project/natsort/

# --- Imports ---

import os
import os.path
import time

# Import our natural sorting module
from natsort import natsorted

# --- Variables ---

# Turn renaming on or off. Values are "True" or "False".
rename = False

# "." is shorthand for the current directory.
root_dir = '.'

# What type(s) of files are we looking for?
# prefix = 'image_'
ext_1 = '.jpg'
ext_2 = '.png'

# --- Lists ---

included_files = []
skipped_files = []
directories = []

# A list of every item (files and subdiretories/folders) in our "root_dir".
everything = os.listdir(root_dir)

# natsorted() returns a natural sort rather than a lexographical sort (which
# is what Windows returns by default). So we get e.g. "file_1.ext, file_2.ext,
# file_11.ext, file_22.ext" rather than "file_1.ext, file_11.ext, file_2.ext,
# file_22.ext".
everything_sorted = natsorted(everything)

# --- Functions ---

# Determine the number of zeros to place in front of a new file name.
# "files_count" is the total number of "included_files" we are working with.

def find_padding(item_count, files_count):

    # Holds our final set of zeros as a string.
    temp_padding = ''

    # Find the number to use as the basis for our maximum number of sequence
    # digits. "-1" prevents leading zeros from being added incorrectly to
    # sequences (e.g. 1-100 becomes 00-99 rather than 000-099).
    total_files = files_count - 1

    # Convert "item_count" and "total_files" to strings and count their digits.
    temp_item_digits = len(str(item_count))
    temp_total_digits = len(str(total_files))

    # How many leading zeros do we need?
    if files_count <= 10:
        temp_padding_digits = 1
    else:
        # Total padding = total digits - current digits
        temp_padding_digits = temp_total_digits - temp_item_digits

    # Add the appropriate number of zeros to our "temp_padding" string
    for zeros in range(temp_padding_digits):
        temp_padding += '0'

    # Return our final padding string
    return temp_padding

# --- Main ---

# Visual aid
print('')

# Separate the items in our "root_dir" directory.
for item in everything_sorted:

    # print(item)
    # time.sleep(0.1)

    temp_item = os.path.join (root_dir, item)

    if os.path.isfile(temp_item):
        # if item.startswith(prefix) and item.endswith(ext):
        if item.endswith(ext_1) or item.endswith(ext_2):
            # print(item)
            included_files.append(item)
            # time.sleep(0.1)
        else:
            skipped_files.append(item)
    else:
        directories.append(item)

# How many "included_files" do we have?
number_of_files = len(included_files)

# For each of our "included_files", determine the correct padding for a given
# sequence number ("item_number") and rename the file.
for item_number in range(number_of_files):

    # Blank our padding string
    padding = ''

    # Custom function
    padding = find_padding(item_number, number_of_files)

    # Our original file name
    src = included_files[item_number]

    # Create a new name for our current file
    if src.endswith(ext_1):
        # dst = str(item) + ext_1
        dst = padding + str(item_number) + ext_1

    # Create a new name for our current file
    if src.endswith(ext_2):
        # dst = str(item) + ext_2
        dst = padding + str(item_number) + ext_2

    print('Processing:\t', src)
    print('Renaming:\t', src, 'to', dst)
    print('')

    # time.sleep(0.1)

    if rename is True:
        os.rename(src, dst)

相关内容