蓝易云:Python 基本文件操作与 os 库(实战向)📁🐍

Python 的文件操作本质是:把磁盘上的“字节流”通过 打开(open) → 读写(read/write) → 关闭(close) 这条链路安全地跑完。os 库则负责和操作系统打交道:路径、目录、权限、环境变量、进程信息等。把这两块掌握,你就能把日志、配置、数据落盘、批处理脚本做得又稳又干净。✅


一、核心对比表:文件模式怎么选(避免踩坑)🧭

场景 模式 是否创建 是否覆盖 典型用途
读文本 "r" 读取配置、读取日志
写文本 "w" 生成报告、覆盖写入
追加文本 "a" 追加日志、追加记录
读写 "r+" 读后再改(不清空)
二进制读 "rb" 读图片、压缩包
二进制写 "wb" 写文件、下载落盘

关键点:"w"清空原文件,上线脚本里要格外谨慎。😄


二、最推荐写法:with 上下文(自动关闭文件)✅

with open("app.log", "r", encoding="utf-8") as f:
    data = f.read()
print(data)

解释(逐行拆解)

  • open("app.log", "r", encoding="utf-8"):以只读方式打开文本文件,并声明编码,避免乱码与平台差异。

  • with ... as f:上下文管理器,代码块结束时会自动执行关闭动作,相当于把“忘记 close”这类低级风险直接消掉。

  • f.read():一次性读全文件,适合小文件;大文件建议用逐行读取(见下)。


三、大文件读取:逐行迭代更稳(省内存)📌

with open("big.log", "r", encoding="utf-8") as f:
    for line in f:
        line = line.rstrip("\n")
        # 这里处理每一行

解释

  • for line in f:按行流式读取,不会把整个文件一次性塞进内存,适合日志、CSV 等大文件。

  • rstrip("\n"):去掉行末换行符,便于拼接、比较、解析。


四、写入与追加:明确控制“覆盖/追加”📝

# 覆盖写入(危险但常用)
with open("report.txt", "w", encoding="utf-8") as f:
    f.write("今日统计:OK\n")

# 追加写入(日志更常用)
with open("report.txt", "a", encoding="utf-8") as f:
    f.write("追加一行记录\n")

解释

  • "w":没有文件就创建,有文件就清空再写;适合“生成全量报告”。

  • "a":总是写到末尾;适合“不可丢”的流水日志。


五、os 与路径/目录:跨平台的关键是 join 与 exists 🧱

import os

base_dir = os.path.dirname(os.path.abspath(__file__))
log_dir = os.path.join(base_dir, "logs")
os.makedirs(log_dir, exist_ok=True)

log_path = os.path.join(log_dir, "app.log")
print(log_path)

解释(逐行拆解)

  • os.path.abspath(__file__):拿到当前脚本的绝对路径,避免“在哪运行就读哪”的漂移问题。

  • os.path.dirname(...):取目录部分,作为工程根定位点。

  • os.path.join(...):按系统规则拼路径(Windows/Linux 分隔符不同,手拼容易出错)。

  • os.makedirs(..., exist_ok=True):递归创建目录;exist_ok=True 表示目录已存在也不报错,脚本可重复执行。


六、常见文件/目录操作:移动、删除、重命名(务必先判断)⚙️

import os

src = "a.txt"
dst = "backup/a.txt"

if os.path.exists(src):
    os.makedirs(os.path.dirname(dst), exist_ok=True)
    os.replace(src, dst)

解释

  • os.path.exists(src):先确认存在再操作,避免异常导致任务中断。

  • os.path.dirname(dst):拿到目标目录,配合 makedirs 先建目录。

  • os.replace(src, dst):替换式移动/重命名;目标存在会被覆盖,适合“以新换旧”的交付逻辑。


七、工作流程图:从“拿路径”到“安全落盘”🔁

flowchart TD
A[定位基准路径<br/>abspath + dirname] --> B[拼接路径<br/>path.join]
B --> C{目录存在?}
C -->|否| D[创建目录<br/>makedirs exist_ok]
C -->|是| E[直接进入文件操作]
D --> E
E --> F[with open 读/写/追加]
F --> G[异常处理/校验结果]

八、实战落地建议(企业级口径)✅

  • 永远优先用 with open,把资源释放做成“默认正确”。

  • 大文件处理默认用 逐行,避免内存飙升。

  • 路径拼接只用 os.path.join,拒绝手写分隔符。

  • 删除/覆盖类操作前先做 exists 校验,必要时加“备份副本”,把可恢复性当 KPI。🙂

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐