2Automate the Boring Stuff with Python(第2版)

文件操作

文件自动化

文件读写路径操作文件夹遍历文件备份

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第2章:文件操作

一、导读

1.1 本章学习目标

第2章讲解 Python 的文件操作:文件读写、路径操作、文件夹遍历、文件备份。

本章核心学习目标:

  • 掌握文件读写:open、read、write
  • 理解 pathlib:现代路径操作
  • 掌握文件夹遍历:os.walk、glob
  • 实现文件备份脚本

1.2 为什么本章如此重要

文件操作是自动化脚本中最常见的任务。掌握文件操作能帮你自动处理大量文件。

1.3 核心问题引导

为什么应该总是用 with 语句打开文件?

pathlib 比 os.path 有什么优势?

如何递归遍历文件夹?


二、核心概念详解

2.1 文件读写

python
# 读取文件
with open('data.txt', 'r') as f:
    content = f.read()        # 全部内容
    # lines = f.readlines()   # 所有行
    # for line in f:          # 逐行

# 写入文件
with open('output.txt', 'w') as f:
    f.write("Hello World\n")
    f.writelines(["Line 1\n", "Line 2\n"])

# 追加
with open('log.txt', 'a') as f:
    f.write("New entry\n")

2.2 pathlib

python
from pathlib import Path

# 路径操作
p = Path('data/subdir/file.txt')
print(p.parent)       # data/subdir
print(p.name)         # file.txt
print(p.stem)         # file
print(p.suffix)       # .txt

# 路径拼接
base = Path('/home/user')
full_path = base / 'documents' / 'file.txt'

# 遍历目录
for item in Path('.').iterdir():
    print(item)

# 递归遍历
for py_file in Path('.').rglob('*.py'):
    print(py_file)

# glob 模式
for txt in Path('data').glob('*.txt'):
    print(txt)

# 文件信息
p = Path('data.txt')
print(p.exists())     # True/False
print(p.is_file())    # True/False
print(p.stat().st_size)  # 文件大小

2.3 文件备份

python
import shutil
from pathlib import Path
from datetime import datetime

def backup_folder(source, backup_dir):
    """备份文件夹"""
    source = Path(source)
    backup_dir = Path(backup_dir)
    
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    backup_name = f"{source.name}_{timestamp}"
    backup_path = backup_dir / backup_name
    
    shutil.copytree(source, backup_path)
    print(f"Backed up to: {backup_path}")
    return backup_path

# 使用
backup_folder('/home/user/documents', '/backup')

三、实战案例

3.1 案例一:批量重命名文件

python
from pathlib import Path
import re

def batch_rename(directory, pattern, replacement):
    """批量重命名文件"""
    dir_path = Path(directory)
    renamed = 0
    
    for file_path in dir_path.iterdir():
        if file_path.is_file():
            new_name = re.sub(pattern, replacement, file_path.name)
            if new_name != file_path.name:
                new_path = file_path.with_name(new_name)
                file_path.rename(new_path)
                print(f"{file_path.name} → {new_name}")
                renamed += 1
    
    print(f"Renamed {renamed} files")

# 将所有空格替换为下划线
batch_rename('./photos', r'\s+', '_')

四、本章小结

with 语句保证文件正确关闭

pathlib 提供面向对象的路径操作

shutil 支持文件和目录的复制、移动、删除


五、思考与练习

如何安全地删除文件(移到回收站而非直接删除)?

如何实现文件的增量备份?


2/7文件操作
0%