20 天学 Python 文件操作:Day 20 综合案例实战
经过 19 天的学习,我们已经掌握了 Python 文件操作的方方面面。今天,我们将通过一个综合案例,把这些知识点串联起来,为文件操作的学习画上完美的句号。
综合案例:文件分类与整理工具
需求描述: 编写一个 Python 脚本,扫描指定目录,按照文件类型将文件分类整理到对应的文件夹中,例如:
- 图片文件(jpg、png)归类到 Images 文件夹。
- 文档文件(pdf、docx)归类到 Documents 文件夹。
- 其他文件归类到 Others 文件夹。
实现步骤
1. 创建目标文件夹
首先,创建存放分类文件的目标文件夹:
import os
def create_folders(base_path, folders):
for folder in folders:
folder_path = os.path.join(base_path, folder)
os.makedirs(folder_path, exist_ok=True)
print(f"已创建文件夹: {folder_path}")
# 测试
base_path = "sorted_files"
folders = ["Images", "Documents", "Others"]
create_folders(base_path, folders)
2. 分类文件
根据文件扩展名,将文件分类到对应的文件夹中。
import shutil
def classify_files(source_path, base_path):
file_types = {
"Images": [".jpg", ".png", ".jpeg"],
"Documents": [".pdf", ".docx", ".txt"],
}
for file in os.listdir(source_path):
file_path = os.path.join(source_path, file)
if os.path.isfile(file_path):
moved = False
for folder, extensions in file_types.items():
if os.path.splitext(file)[1].lower() in extensions:
shutil.move(file_path, os.path.join(base_path, folder, file))
print(f"已移动文件: {file} -> {folder}")
moved = True
break
if not moved:
shutil.move(file_path, os.path.join(base_path, "Others", file))
print(f"已移动文件: {file} -> Others")
# 测试
source_path = "unsorted_files"
classify_files(source_path, base_path)
3. 打印分类结果
完成分类后,打印整理好的文件结构:
def print_sorted_files(base_path):
for folder in os.listdir(base_path):
folder_path = os.path.join(base_path, folder)
print(f"\n{folder}:")
for file in os.listdir(folder_path):
print(f" - {file}")
# 测试
print_sorted_files(base_path)
4. 综合代码
将上述功能整合到一个完整的脚本中:
import os
import shutil
def create_folders(base_path, folders):
for folder in folders:
os.makedirs(os.path.join(base_path, folder), exist_ok=True)
def classify_files(source_path, base_path):
file_types = {
"Images": [".jpg", ".png", ".jpeg"],
"Documents": [".pdf", ".docx", ".txt"],
}
for file in os.listdir(source_path):
file_path = os.path.join(source_path, file)
if os.path.isfile(file_path):
for folder, extensions in file_types.items():
if os.path.splitext(file)[1].lower() in extensions:
shutil.move(file_path, os.path.join(base_path, folder, file))
break
else:
shutil.move(file_path, os.path.join(base_path, "Others", file))
def print_sorted_files(base_path):
for folder in os.listdir(base_path):
folder_path = os.path.join(base_path, folder)
print(f"\n{folder}:")
for file in os.listdir(folder_path):
print(f" - {file}")
# 综合测试
source_path = "unsorted_files"
base_path = "sorted_files"
folders = ["Images", "Documents", "Others"]
create_folders(base_path, folders)
classify_files(source_path, base_path)
print_sorted_files(base_path)
5. 实践练习
- 添加更多的文件类型分类,例如音乐文件(mp3、wav)。
- 扩展功能:支持递归扫描子目录中的文件。
- 优化代码:为每种文件类型计算总大小并输出统计信息。
恭喜你完成了 20 天的 Python 文件操作学习!!!!