我正在寻找一个脚本,可以让我批量重命名 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
time
和print
语句完全是可选的(因此包括在内,但用 注释掉#
)。
注意事项
如下配置,此脚本:
默认情况下重命名已关闭。
rename=True
一旦您确定其按您希望的方式运行,请设置。仅对调用它的目录进行操作(从不操作子目录)。
查找以
.jpg
和结尾的文件.png
。如果您不想查找这些文件进行重命名,则需要编辑脚本的部分内容。重命名遇到的文件。这意味着某些图像可能(可能)被重命名,而不是按照其预期顺序。某些情况可以通过自然排序(当前在下面的脚本中实现)来克服。也就是说,如果 Windows 在被要求提供当前目录的内容时返回例如
some-jpeg.jpg
,则此脚本将重命名这些内容例如、等。作为部分修复,您可以简单地仅使用例如或仅使用 目录中的文件。some-png.png
00.jpg
01.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)