Python脚本:批量重命名文件
这个Python脚本旨在帮助用户批量重命名指定目录中的文件。其功能包括:
- 目录指定: 用户可以通过命令行指定需要重命名文件的目录。
- 文件类型筛选: 脚本会列出目录中所有文件类型,让用户选择特定类型的文件进行重命名。
- 时间戳添加: 自动在文件名前添加文件的创建时间(格式为 YYYYMMDDHHMM)作为前缀。
- 毫秒数选项: 用户可以选择是否在时间戳中包含毫秒数(格式为 YYYYMMDDHHMM_SSS)。
- 特殊字符处理: 自动将文件名中的特殊字符和空格替换为下划线,并删除括号。
代码实现
import os
import sys
import time
def replace_special_chars(file_name):
file_name = file_name.replace('(', '').replace(')', '')
special_chars = [' ', ':', '/', '\\', '|', '?', '*', '<', '>', '\"']
for char in special_chars:
file_name = file_name.replace(char, '_')
return file_name
def get_creation_time(path, include_millisec):
birth_time = os.stat(path).st_birthtime
time_format = "%Y%m%d%H%M"
if include_millisec:
millisec = int((birth_time - int(birth_time)) * 1000)
time_format += f"_{millisec:03d}"
return time.strftime(time_format, time.localtime(birth_time))
def get_file_extensions(directory):
extensions = set()
for root, dirs, files in os.walk(directory):
for file in files:
if file.startswith('.'):
continue
ext = os.path.splitext(file)[1].lower()
if ext:
extensions.add(ext[1:])
return sorted(extensions)
def count_files(directory, extensions_to_rename):
return sum([len([f for f in files if os.path.splitext(f)[1][1:].lower() in extensions_to_rename]) for r, d, files in os.walk(directory)])
def rename_files_in_directory(directory, extensions_to_rename, include_millisec):
total_files = count_files(directory, extensions_to_rename)
processed = 0
for root, dirs, files in os.walk(directory):
for file in files:
ext = os.path.splitext(file)[1][1:].lower()
if ext not in extensions_to_rename or file.startswith('.'):
continue
processed += 1
new_name = replace_special_chars(file)
creation_time = get_creation_time(os.path.join(root, file), include_millisec)
new_name_with_time = f"{creation_time}_{new_name}"
try:
if new_name_with_time != file:
os.rename(os.path.join(root, file), os.path.join(root, new_name_with_time))
print(f"[{processed}/{total_files}] Renamed: {file} -> {new_name_with_time}")
else:
print(f"[{processed}/{total_files}] No change: {file}")
except FileNotFoundError:
print(f"Error: File not found or unable to rename - {file}")
if len(sys.argv) > 1:
directory = sys.argv[1]
available_extensions = get_file_extensions(directory)
print("Available file types:")
for i, ext in enumerate(available_extensions, 1):
print(f"{i}. {ext}")
selection = input("Enter the numbers of file types to rename (e.g., 1,2,4): ")
selected_indices = [int(i) for i in selection.split(',') if i.isdigit()]
extensions_to_rename = {available_extensions[i-1] for i in selected_indices if i-1 < len(available_extensions)}
include_millisec_answer = input("Include milliseconds in the timestamp? (y/n): ").lower()
include_millisec = include_millisec_answer == 'y'
rename_files_in_directory(directory, extensions_to_rename, include_millisec)
else:
print("Error: No directory provided. Please specify a directory.")
使用方法
- 将脚本保存为
rename_files.py
。 - 在命令行中运行脚本,并指定需要处理的目录:
python rename_files.py /path/to/directory
- 根据提示选择要重命名的文件类型和是否包含毫秒数。
这个脚本会处理文件名中的特殊字符和空格,将它们替换为下划线,并删除括号。如果有任何问题,请确保目录路径和权限正确。