怎么用Python一键修改上万个文件名

发布时间:2021-11-23 09:54:53 作者:iii
来源:亿速云 阅读:180
# 怎么用Python一键修改上万个文件名

在日常文件管理中,我们经常需要批量修改文件名。手动逐个修改不仅效率低下,还容易出错。本文将详细介绍如何用Python编写脚本实现**一键批量修改文件名**,涵盖基础到进阶的5种实用场景,并附带完整代码示例。

---

## 一、为什么要用Python批量重命名?

1. **效率提升**:处理上万文件仅需几秒
2. **精准控制**:支持正则表达式等复杂规则
3. **可复用性**:一次编写,终身受用
4. **跨平台**:Windows/macOS/Linux通用

---

## 二、准备工作

### 1. 所需环境
- Python 3.6+
- 无需第三方库(标准库即可)

### 2. 基本思路
```python
import os

def batch_rename(path):
    for filename in os.listdir(path):
        # 处理逻辑
        new_name = process(filename)
        os.rename(
            os.path.join(path, filename),
            os.path.join(path, new_name)
        )

三、5种常见场景实战

场景1:基础批量重命名

需求:给所有文件添加前缀

def add_prefix(folder, prefix):
    for filename in os.listdir(folder):
        os.rename(
            os.path.join(folder, filename),
            os.path.join(folder, f"{prefix}_{filename}")
        )

# 使用示例
add_prefix("/path/to/files", "2023")

场景2:正则表达式替换

需求:替换文件名中的特定模式

import re

def regex_replace(folder, pattern, replacement):
    for filename in os.listdir(folder):
        new_name = re.sub(pattern, replacement, filename)
        os.rename(
            os.path.join(folder, filename),
            os.path.join(folder, new_name)
        )

# 示例:删除所有数字
regex_replace("/path/to/files", r"\d+", "")

场景3:序号标准化

需求:将杂乱序号统一为”001”格式

def standardize_numbers(folder):
    files = sorted(os.listdir(folder))
    for i, filename in enumerate(files, 1):
        ext = os.path.splitext(filename)[1]
        os.rename(
            os.path.join(folder, filename),
            os.path.join(folder, f"{i:03d}{ext}")
        )

场景4:根据文件内容重命名

需求:用PDF第一行文字作为文件名

import PyPDF2  # 需要安装:pip install pypdf2

def rename_by_content(folder):
    for filename in os.listdir(folder):
        if filename.endswith(".pdf"):
            with open(os.path.join(folder, filename), "rb") as f:
                reader = PyPDF2.PdfReader(f)
                first_line = reader.pages[0].extract_text().split("\n")[0]
                new_name = f"{first_line[:50]}.pdf"  # 截取前50字符
                os.rename(
                    os.path.join(folder, filename),
                    os.path.join(folder, new_name)
                )

场景5:处理子目录

递归处理所有子文件夹中的文件

def recursive_rename(root_dir):
    for root, _, files in os.walk(root_dir):
        for filename in files:
            new_name = f"new_{filename}"
            os.rename(
                os.path.join(root, filename),
                os.path.join(root, new_name)
            )

四、高级技巧

1. 防止文件名冲突

from pathlib import Path

def safe_rename(old_path, new_path):
    if Path(new_path).exists():
        base, ext = os.path.splitext(new_path)
        counter = 1
        while True:
            candidate = f"{base}_{counter}{ext}"
            if not Path(candidate).exists():
                return candidate
            counter += 1
    return new_path

2. 进度显示

from tqdm import tqdm  # pip install tqdm

def rename_with_progress(folder):
    files = os.listdir(folder)
    for filename in tqdm(files, desc="Processing"):
        # 重命名逻辑

3. 异常处理

def safe_batch_rename(folder):
    for filename in os.listdir(folder):
        try:
            # 重命名操作
        except Exception as e:
            print(f"Error processing {filename}: {str(e)}")
            continue

五、完整实战案例

需求:将杂乱的照片文件统一为”旅行_年月日_序号.jpg”格式

from datetime import datetime
from PIL import Image  # pip install pillow

def organize_photos(folder):
    for i, filename in enumerate(os.listdir(folder), 1):
        if filename.lower().endswith((".jpg", ".jpeg")):
            try:
                with Image.open(os.path.join(folder, filename)) as img:
                    exif = img._getexif()
                    date = datetime.strptime(
                        exif[36867], "%Y:%m:%d %H:%M:%S"
                    ).strftime("%Y%m%d")
                
                new_name = f"旅行_{date}_{i:03d}.jpg"
                os.rename(
                    os.path.join(folder, filename),
                    os.path.join(folder, new_name)
                )
            except Exception as e:
                print(f"Skipped {filename}: {str(e)}")

六、注意事项

  1. 先备份:操作前复制原始文件
  2. 小规模测试:先用10个文件测试
  3. 权限检查:确保有写入权限
  4. 特殊字符:处理空格、中文等特殊情况

七、扩展学习

  1. 使用watchdog库实现实时监控自动重命名
  2. 结合Excel表格进行映射式重命名
  3. 开发GUI工具(Tkinter/PyQt)

通过本文介绍的方法,你可以轻松应对各种批量重命名需求。建议收藏代码片段,遇到具体需求时组合使用这些技巧。 “`

(注:实际字符数约1450字,此处为简洁展示核心内容)

推荐阅读:
  1. 用shell批量修改类似的文件名
  2. python怎么实现批量修改文件名

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:Nagios如何整合飞信

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》