悠闲博客-blog.yxrjt.cn

Python3文件操作:实战技巧,助你高效管理数据文件!

更新时间:2025-09-21 18:20点击:50

进阶篇:高效技巧

1. 逐行读取

处理大文件时,逐行读取可以有效避免内存溢出:

with open('largefile.txt', 'r') as file:
    for line in file:
        print(line, end='')

2. 文件操作相关模块

Python提供了一些模块来简化文件操作,如osshutil

  • os模块:提供文件和目录操作功能。
  • shutil模块:提供文件和目录复制、移动、删除等功能。

3. 文件路径处理

使用os.path模块可以方便地处理文件路径:

import os

# 获取文件名
filename = os.path.basename('path/to/file.txt')
print(filename)  # 输出:file.txt

# 获取目录名
dirname = os.path.dirname('path/to/file.txt')
print(dirname)  # 输出:path/to

# 判断文件是否存在
if os.path.exists('path/to/file.txt'):
    print('文件存在')
else:
    print('文件不存在')

4. 文件加密与解密

使用cryptography库可以实现文件的加密和解密:

from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# 加密文件
with open('example.txt', 'rb') as file:
    original_data = file.read()
encrypted_data = cipher_suite.encrypt(original_data)

# 解密文件
with open('example.txt', 'wb') as file:
    file.write(cipher_suite.decrypt(encrypted_data))

实战案例:批量重命名文件

以下是一个批量重命名文件的实战案例:

import os

# 原始文件名格式:20230928_01.txt
# 目标文件名格式:year_month_day_001.txt

for filename in os.listdir('.'):
    if filename.startswith('2023'):
        year_month_day = filename[0:10]
        index = filename[11:-4]
        new_filename = f"{year_month_day}_{index}.txt"
        os.rename(filename, new_filename)


三、文件“周边操作”:重命名、删除、目录管理
除了读写,我们还需要对文件/目录进行“增删改查”。这需要借助os模块(操作系统接口),
它能帮你完成更底层的操作。

3.1 重命名与删除:文件的“改名”与“删除”
os.rename(old_path, new_path):重命名文件/目录;
os.remove(file_path):删除文件(注意:无法恢复!);
os.rmdir(dir_path):删除空目录(非空目录会报错)。
示例:清理临时文件

import os

# 重命名文件:将"temp_log.txt"改为"202310_log.txt"
os.rename("temp_log.txt", "202310_log.txt")

# 删除无用的临时文件(确保文件存在,否则会报错)
if os.path.exists("trash.txt"):  # 检查文件是否存在
    os.remove("trash.txt")
    print("临时文件已删除")
else:
    print("文件不存在,无需删除")

# 删除空目录(假设"empty_dir"是空的)
if os.path.isdir("empty_dir") and not os.listdir("empty_dir"):  # 检查是否为空目录
    os.rmdir("empty_dir")
    print("空目录已删除")


3.2 创建与遍历目录:“新建文件夹”的高级玩法
os.mkdir(dir_path):创建单级目录(父目录必须存在,否则报错);
os.makedirs(dir_path, exist_ok=True):递归创建多级目录(exist_ok=True表示目录存在时不报错);
os.listdir(dir_path):获取目录下所有文件/子目录的名称列表;
os.path模块:处理路径的“神器”(如os.path.join()拼接路径,os.path.splitext()分离文件名和后缀)。
示例:创建分类文件夹并整理文件

import os
from shutil import move  # 用于移动文件(需导入shutil模块)

# 目标:将下载目录中的文件按类型分类到"图片""文档""其他"文件夹
download_dir = "./downloads"
target_dirs = {
    "图片": [".jpg", ".png", ".gif"],
    "文档": [".docx", ".pdf", ".txt"],
    "其他": []
}

# 1. 递归创建目标目录(如果不存在)
for dir_name in target_dirs.keys():
    target_path = os.path.join(download_dir, dir_name)
    os.makedirs(target_path, exist_ok=True)  # exist_ok=True避免重复创建报错

# 2. 遍历下载目录中的文件
for filename in os.listdir(download_dir):
    file_path = os.path.join(download_dir, filename)
    # 跳过目录,只处理文件
    if os.path.isfile(file_path):
        # 获取文件后缀(转小写,兼容.JPG等情况)
        ext = os.path.splitext(filename)[1].lower()
        # 判断分类
        for dir_name, exts in target_dirs.items():
            if ext in exts:
                target_path = os.path.join(download_dir, dir_name, filename)
                move(file_path, target_path)  # 移动文件到目标目录
                print(f"已将 {filename} 移动到 {dir_name} 文件夹")
                break
        else:
            # 未匹配到类型,归为"其他"
            target_path = os.path.join(download_dir, "其他", filename)
            move(file_path, target_path)
            print(f"已将 {filename} 移动到 其他 文件夹")

四、实战示例:三个场景搞定文件操作
前面的知识需要实战检验,这里给出三个高频场景的解决方案。

示例1:目录清洗——删除30天前的日志文件
运维中常需要定期清理旧日志,避免磁盘爆炸。

import os
import time
from datetime import datetime

log_dir = "./logs"
max_age_days = 30  # 保留最近30天的日志

# 遍历日志目录下的所有文件
for filename in os.listdir(log_dir):
    file_path = os.path.join(log_dir, filename)
    if os.path.isfile(file_path):
        # 获取文件最后修改时间(时间戳)
        modify_time = os.path.getmtime(file_path)
        # 计算文件年龄(天)
        current_time = time.time()
        age_days = (current_time - modify_time) / (24 * 3600)
        # 如果超过30天,删除文件
        if age_days > max_age_days:
            os.remove(file_path)
            print(f"已删除过期日志:{filename}(最后修改于{datetime.fromtimestamp(modify_time)})")


示例2:批量命名——给百张照片添加时间前缀
手机导出的照片常是“IMG_1234.jpg”,想改成“2023-10-01_IMG_1234.jpg”。

import os
from datetime import datetime

photo_dir = "./photos"
# 遍历目录下所有图片文件
for filename in os.listdir(photo_dir):
    # 只处理.jpg和.png文件
    if filename.lower().endswith((".jpg", ".png")):
        file_path = os.path.join(photo_dir, filename)
        # 获取文件创建时间(或修改时间,根据需求调整)
        create_time = os.path.getctime(file_path)
        time_str = datetime.fromtimestamp(create_time).strftime("%Y-%m-%d") 
        # 格式化为"2023-10-01"
        # 新文件名:时间前缀+原文件名
        new_filename = f"{time_str}_{filename}"
        new_path = os.path.join(photo_dir, new_filename)
        # 重命名(注意:如果新文件名已存在会覆盖,需添加防重逻辑!)
        os.rename(file_path, new_path)
        print(f"已重命名:{filename} → {new_filename}")


示例3:检测同名文件夹——避免数据覆盖
部署项目时,可能误操作创建同名文件夹导致数据丢失,需要提前检测。

import os

def check_duplicate_dirs(target_dir):
    """检测目标目录下是否有同名文件夹(不区分大小写)"""
    dir_names = [d.lower() for d in os.listdir(target_dir) if os.path.isdir(os.path.join(target_dir, d))]
    # 统计名称出现次数(不区分大小写)
    name_counts = {}
    for name in dir_names:
        name_counts[name] = name_counts.get(name, 0) + 1
    # 找出重复的名称
    duplicates = [name for name, count in name_counts.items() if count > 1]
    if duplicates:
        print(f"警告:以下文件夹名称重复(不区分大小写):{duplicates}")
        return False
    else:
        print("无同名文件夹,可安全操作")
        return True

# 测试:假设target_dir下有"Logs"和"logs"两个文件夹
check_duplicate_dirs("./target_dir")  # 输出:警告:以下文件夹名称重复
(不区分大小写):['logs']

结语:文件操作是程序员的“基础功”,但绝不是“简单活”
从打开一个文件到批量整理目录,Python用简洁的语法封装了复杂的系统操作。
但要注意:文件操作不可逆(删除后无法恢复),
一定要先备份或做好条件判断(如os.path.exists())。

栏目分类

联系方式
  • help@yxrjt.cn
  • lgc@yxrjt.cn
  • admin@yxrjt.cn