当前位置: 首页 > news >正文

一、快速掌握Python 中的文件操作知识体系

快速掌握Python 文件操作知识体系

文章目录

  • 快速掌握Python 文件操作知识体系
      • 🔰 基础层(必须掌握,最核心的文件知识)
      • 📈 进阶层(用得多,但新手常忽略)
    • Python 文件操作重要语法总结表
    • Windows 文件路径写法对照表
  • 0⃣ 基础准备:路径与文件位置(容易忽略)
    • 定义
    • 作用
    • 通用语法
    • 典型示例(逐行注解)
  • 1⃣ 文件的编码(避免中文乱码)
    • 定义
    • 作用
    • 通用语法
    • 典型示例(逐行注解)
  • 2⃣ 打开模式(读/写/追加/二进制)
    • 定义
    • 作用
    • 常见模式
    • 典型示例(逐行注解)
  • 3⃣ 读取文件(read / readline / for 逐行)
    • 定义
    • 作用
    • 通用语法
    • 典型示例(逐行注解)
  • 4⃣ 写入与覆盖(w)
    • 定义
    • 作用
    • 通用语法
    • 典型示例(逐行注解)
  • 5⃣ 追加写入(a)
    • 定义
    • 作用
    • 典型示例(逐行注解)
  • 6⃣ 文件指针(seek / tell)
    • 定义
    • 作用
    • 通用语法
    • 典型示例(逐行注解)
  • 7⃣ with 上下文(自动关闭)
    • 定义
    • 作用
    • 典型示例(逐行注解)
  • 8⃣ 文本 vs 二进制(图片/音频/模型)
    • 定义
    • 作用
    • 典型示例(逐行注解)
  • 9⃣ 文件系统操作(os / pathlib)
    • 定义
    • 作用
    • 典型示例(逐行注解)
  • 🔟 JSON(结构化数据,前后端通用)
    • 定义
    • 作用
    • 典型示例(逐行注解)
  • 1️⃣1️⃣ CSV(表格数据,Excel 友好)
    • 定义
    • 作用
    • 典型示例(逐行注解)
  • 1️⃣2️⃣ Pickle(把 Python 对象“原封不动”存成二进制)
    • 定义
    • 作用
    • 典型示例(逐行注解)
  • 1️⃣3️⃣ 异常处理(健壮性)
    • 定义
    • 典型示例(逐行注解)
  • 1️⃣4️⃣ 综合小案例(把上面知识串起来)
    • ✅ 易错与技巧清单(考试/面试常问)

🔰 基础层(必须掌握,最核心的文件知识)

  1. 文件路径(绝对/相对路径,os.getcwd()
  2. 文件编码(UTF-8、GBK)
  3. 打开模式r/w/a/rb/wb/r+ 等)
  4. 文件读取read / readline / for line in f
  5. 文件写入write 覆盖写)
  6. 文件追加a 模式追加写)
  7. with 上下文(自动关闭文件)
  8. 文件指针seek / tell,定位光标)

👉 这些就是 Python 文件操作的基本功,几乎所有教材、考试、项目都会涉及。


📈 进阶层(用得多,但新手常忽略)

  1. 逐行读取大文件(节省内存,适合大日志/大数据文件)
  2. 二进制文件操作(图片、音频、视频必须用 rb/wb
  3. 文件系统管理(删除、重命名、判断存在、建目录 → os / pathlib
  4. 异常处理(文件不存在/权限不足 → try...except

Python 文件操作重要语法总结表

语法/写法含义/作用示例代码
open 基本格式打开文件(路径 + 模式 + 编码)f = open("路径", mode="r", encoding="utf-8")
关闭文件手动释放资源f.close()
with 上下文自动关闭文件(推荐)with open("a.txt", "r", encoding="utf-8") as f:
读取全部一次性读取整个文件f.read()
读取部分读取前 N 个字符f.read(10)
读取一行逐行处理f.readline()
读取所有行返回列表(大文件不推荐)f.readlines()
逐行遍历内存友好,适合大文件for line in f:
写入(覆盖)覆盖写入open("a.txt","w").write("内容")
写入(追加)文件末尾追加内容open("a.txt","a").write("内容")
文件指针位置获取当前位置f.tell()
移动文件指针移动到指定位置f.seek(0)
文本模式默认,处理字符串open("a.txt","r",encoding="utf-8")
二进制模式处理图片/音频等原始字节open("a.png","rb")

Windows 文件路径写法对照表

写法是否正确示例
直接写 \❌ 错误(\U 被当转义)"C:\Users\me\file.txt"
双斜杠 \\✅ 正确"C:\\Users\\me\\file.txt"
原始字符串 r"..."✅ 正确r"C:\Users\me\file.txt"
/✅ 正确(推荐跨平台)"C:/Users/me/file.txt"
pathlib✅ 正确(现代写法)from pathlib import Path; Path("C:/Users/me/file.txt")

0⃣ 基础准备:路径与文件位置(容易忽略)

定义

路径就是文件在磁盘里的“地址”;分绝对路径(从盘符或根目录开始)与相对路径(相对于当前工作目录)。

作用

找得到文件,读写才不会报错。

通用语法

  • 绝对:"C:/data/text.txt""/home/user/text.txt"
  • 相对:"data/text.txt"(相对 当前工作目录

典型示例(逐行注解)

import os                                             # 导入 os 用于查看当前目录
print(os.getcwd())                                    # 打印“当前工作目录”,相对路径都以它为起点
# 假设当前目录下有一个 data 目录,里面有 demo.txt
relative_path = "data/demo.txt"                       # 相对路径:相对于 os.getcwd()
absolute_path = os.path.abspath(relative_path)        # 把相对路径变成绝对路径,便于排错
print(absolute_path)                                  # 看看真实完整路径长什么样

小提示:路径写错、工作目录不对,是新手读写失败的第一大原因。不会就先 print(os.getcwd())


1⃣ 文件的编码(避免中文乱码)

定义

编码把“字符”↔“字节”互转,常见有 UTF-8(全球通用编码)、GBKBig5等。

作用

跨平台/跨软件读写时不乱码。

通用语法

open("路径", mode="r", encoding="utf-8")

"路径" → 你要操作的文件路径(例如 "data.txt")。

mode="r" → 打开模式(r=只读,w=写入,a=追加,rb/wb=二进制)。

encoding="utf-8" → 指定编码方式(防止中文乱码,常用 utf-8)。

典型示例(逐行注解)

# 读取 UTF-8 文本文件
with open("data/demo.txt", "r", encoding="utf-8") as f:  # r=只读;encoding 指定为 UTF-8content = f.read()                                    # 一次性读出全部文本为字符串print(content)                                        # 打印看看内容是否正常
# with 结束会自动关闭文件,无需 f.close()

2⃣ 打开模式(读/写/追加/二进制)

定义

打开模式决定能不能读、能不能写、是否覆盖、是否二进制。

作用

根据需求选择正确模式,避免覆盖读不到

常见模式

  • "r":只读(文件必须存在)
  • "w":写入(会清空原文件)
  • "a":追加(在末尾继续写)
  • "rb"/"wb"/"ab"二进制读/写/追加(图片、音频、模型等)
  • "r+":读写(必须存在)
  • "w+":写读(先清空)
  • "a+":追加读写(指针在末尾,写完读需要 seek

典型示例(逐行注解)

# 追加日志,不覆盖历史
with open("logs/app.log", "a", encoding="utf-8") as f:   # a=append 追加f.write("程序启动成功\n")                              # 手动加换行符 \n

3⃣ 读取文件(read / readline / for 逐行)

定义

把磁盘中的内容读到内存。

作用

读取配置、分析日志、加载数据集。

通用语法

f.read()        # 全部
f.readline()    # 一行
f.readlines()   # 所有行(列表,不太省内存)

典型示例(逐行注解)

# 小文件:一次性读完
with open("data/small.txt", "r", encoding="utf-8") as f:text = f.read()                                      # 返回整个文件内容(字符串)print(text)# 大文件:逐行读取,省内存
with open("data/big.txt", "r", encoding="utf-8") as f:for line in f:                                       # 文件对象可直接迭代,一次一行line = line.rstrip("\n")                         # 去掉行尾换行符,避免多空行print(line)

4⃣ 写入与覆盖(w)

定义

把内存数据写到文件(会清空原内容)。

作用

生成/更新文件、导出结果。

通用语法

open("路径", "w", encoding="utf-8").write("文本")

典型示例(逐行注解)

# 覆盖写入
with open("output/result.txt", "w", encoding="utf-8") as f:f.write("第一行\n")                                  # 每次 write 不会自动换行f.write("第二行\n")                                  # 需要手动加 \n

5⃣ 追加写入(a)

定义

在文件末尾继续写,不覆盖已有内容。

作用

写日志、逐步积累数据。

典型示例(逐行注解)

with open("output/result.txt", "a", encoding="utf-8") as f:f.write("追加一行时间戳: 2025-08-27 14:00\n")        # 一直往后加

6⃣ 文件指针(seek / tell)

定义

指针是文件内部的“光标位置”,决定从哪读/写。

作用

随机访问;a+ 写完想读就必须 seek 回去。

通用语法

f.tell()                 # 当前位置(字节/字符位置)
f.seek(offset, whence)   # 移动指针:whence=0开头,1当前,2末尾

典型示例(逐行注解)

# 在 a+ 下写完再读:必须把指针移回
with open("output/seek_demo.txt", "a+", encoding="utf-8") as f:f.write("hello\n")                                    # 末尾追加print(f.tell())                                       # 当前在文件末尾f.seek(0)                                             # 回到开头print(f.readline().strip())                           # 现在可以读到第一行

7⃣ with 上下文(自动关闭)

定义

with open(...) as f: 语法会在代码块结束时自动关闭文件。

作用

避免忘记 close() 导致资源泄露或写入未落盘。

典型示例(逐行注解)

# with 是最佳实践:干净、可靠
with open("data/auto_close.txt", "w", encoding="utf-8") as f:f.write("这行写完就会自动关闭文件\n")                 # 出错也会正确清理资源

8⃣ 文本 vs 二进制(图片/音频/模型)

定义

文本模式处理字符串;二进制模式处理原始字节(bytes)。

作用

图片、音频、Pickle 文件都必须用 b 模式

典型示例(逐行注解)

# 复制图片:二进制按块读写
chunk_size = 64 * 1024                                    # 每次读 64KB,避免一次性读完
with open("assets/logo.png", "rb") as src:                # rb = 二进制只读with open("backup/logo_copy.png", "wb") as dst:       # wb = 二进制写入(覆盖)while True:chunk = src.read(chunk_size)                  # 读一块字节if not chunk:                                 # 为空表示到文件末尾breakdst.write(chunk)                              # 写入目标文件

9⃣ 文件系统操作(os / pathlib)

定义

不仅要读内容,也常常要判断、重命名、删除、建目录

作用

配合读写完成“文件生命周期管理”。

典型示例(逐行注解)

import os
from pathlib import Path# 目录确保存在
Path("output").mkdir(parents=True, exist_ok=True)         # 不存在就创建,已存在不报错# 判断/重命名/删除
print(os.path.exists("output/result.txt"))                # True/False
os.rename("output/result.txt", "output/final.txt")        # 改名
os.remove("output/final.txt")                             # 删除文件

🔟 JSON(结构化数据,前后端通用)

定义

JSON 是“字典/列表”的文本表示,最常用的数据交换格式。

作用

把 Python 对象无损保存到文本;跨语言通用。

典型示例(逐行注解)

import jsondata = {"name": "张三", "age": 20, "skills": ["Python", "SQL"]}   # 普通字典# 写入 JSON 文件(中文不转义,缩进 4 格)
with open("data/user.json", "w", encoding="utf-8") as f:json.dump(data, f, ensure_ascii=False, indent=4)              # 更美观、更易读# 读取 JSON 文件为 Python 对象
with open("data/user.json", "r", encoding="utf-8") as f:obj = json.load(f)                                            # 恢复成字典/列表print(obj["name"])                                            # 访问字段:张三

1️⃣1️⃣ CSV(表格数据,Excel 友好)

定义

逗号分隔的纯文本表格格式。

作用

导入/导出 Excel 或数据分析用表格。

典型示例(逐行注解)

import csv# 写 CSV(Windows 一定加 newline="",否则会多空行)
with open("data/users.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)                                        # 创建写入器writer.writerow(["姓名", "年龄"])                              # 写表头(一行)writer.writerow(["张三", 20])                                  # 写一行数据writer.writerow(["李四", 22])                                  # 再写一行# 读 CSV(逐行解析成列表)
with open("data/users.csv", "r", encoding="utf-8") as f:reader = csv.reader(f)                                        # 创建读取器for row in reader:                                            # 每一行是一个 listprint(row)                                                # ['姓名', '年龄'] ...

1️⃣2️⃣ Pickle(把 Python 对象“原封不动”存成二进制)

定义

序列化:把任意 Python 对象转成字节;反序列化:从字节还原对象。

作用

保存模型、缓存复杂数据结构(注意只给自己/可信环境用)。

典型示例(逐行注解)

import pickleobj = {"a": 1, "b": [1, 2, 3]}                                  # 任意对象(可嵌套)# 保存为二进制
with open("data/cache.pkl", "wb") as f:                          # wb=二进制写pickle.dump(obj, f)                                          # 序列化到文件# 读取并还原
with open("data/cache.pkl", "rb") as f:                          # rb=二进制读restored = pickle.load(f)                                    # 反序列化print(restored)                                              # {'a': 1, 'b': [1, 2, 3]}

1️⃣3️⃣ 异常处理(健壮性)

定义

文件可能不存在/占用/权限不足,用 try…except 兜底不崩。

典型示例(逐行注解)

try:with open("data/not_exists.txt", "r", encoding="utf-8") as f:print(f.read())                                          # 试图读取一个不存在的文件
except FileNotFoundError:                                        # 精确捕获:文件未找到print("文件不存在,请检查路径或文件名!")                        # 友好提示

1️⃣4️⃣ 综合小案例(把上面知识串起来)

需求:读取一份原始文本,去掉空行与首尾空白,统计行数、字数、字符数,
写回“清洗后的文本”,并把统计信息同时保存到 JSON 和 CSV。

import os
import json
import csv
from pathlib import Path# 1) 准备输入输出路径
inp = Path("data/raw.txt")                                       # 原始文本
out_text = Path("output/clean.txt")                              # 清洗后的文本
out_json = Path("output/stats.json")                             # 统计信息(JSON)
out_csv  = Path("output/stats.csv")                              # 统计信息(CSV)# 2) 确保 output 目录存在
out_text.parent.mkdir(parents=True, exist_ok=True)               # 没有就创建# 3) 逐行读取 + 清洗 + 统计
clean_lines = []                                                 # 存放清洗后的行
line_count = word_count = char_count = 0                         # 三个统计量归零with open(inp, "r", encoding="utf-8") as f:                      # 以 UTF-8 逐行读取for line in f:                                               # 一次读一行,省内存line = line.strip()                                      # 去掉首尾空白(含换行)if not line:                                             # 空行直接跳过continueclean_lines.append(line)                                 # 收集保留的行line_count += 1                                          # 行数 +1word_count += len(line.split())                          # 简单按空格切分统计词数char_count += len(line)                                  # 字符数(含中文按字符计)# 4) 写回清洗后的文本
with open(out_text, "w", encoding="utf-8") as f:                 # 覆盖写入for line in clean_lines:f.write(line + "\n")                                     # 逐行写出,补上换行# 5) 统计信息 -> JSON
stats = {"lines": line_count, "words": word_count, "chars": char_count}
with open(out_json, "w", encoding="utf-8") as f:json.dump(stats, f, ensure_ascii=False, indent=4)            # 漂亮地写 JSON# 6) 统计信息 -> CSV(表格友好)
with open(out_csv, "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(["指标", "数值"])                              # 表头writer.writerow(["行数", line_count])writer.writerow(["单词数(粗略)", word_count])writer.writerow(["字符数", char_count])print("处理完成:")
print(f"  清洗文本:{out_text}")
print(f"  统计JSON:{out_json}")
print(f"  统计CSV :{out_csv}")

✅ 易错与技巧清单(考试/面试常问)

  • Windows CSV 多空行:写 CSV 时一定 newline=""
  • a+ 读不到a+ 写完读之前 f.seek(0)
  • 编码不明:优先用 UTF-8;不确定时试 encoding="utf-8", errors="ignore" 临时兜底。
  • 大文件:不要 read() / readlines() 一次性全读,改用 for line in f
  • 目录不存在:先 Path(...).mkdir(parents=True, exist_ok=True)
  • 二进制文件:必须 rb/wb,绝不能在文本模式下处理图片/音频/模型。
http://www.dtcms.com/a/353927.html

相关文章:

  • mysql zip包安装步骤
  • 2025(秋)中国国际健康产业(成都)博览会:探索健康未来辉煌
  • TCP 并发服务器构建
  • 场外期权能做套利吗?
  • 二叉树的工程实践与高频问题(续):从LeetCode真题到系统设计的深度剖析
  • centos7 安装指定版本的fastfds
  • 了解CDC(变更数据捕获)如何革新数据集成方式
  • Linux 系统调优工具与实践指南
  • 个人博客系统系统---测试报告
  • HarmonyOS布局实战:用声明式UI构建自适应电商卡片
  • 【源码分析】@vue/runtime-dom/src/apiCustomElement.ts 解析
  • 重磅升级,Pixso 2.0赋能HarmonyOS应用设计与开发
  • 安卓11 12系统修改定制化_____如何修改固件 实现给指定内置的应用无障碍权限
  • Sybase 安装与备份
  • 【c++】超好玩游戏
  • 一、CSS3 新增选择器(非 “属性”,但为核心基础)
  • day082-初识ElasticStack
  • 路由基础(二):路由表和FIB表
  • Ansible文件管理与Jinja2模板
  • Linux查看SFTP登录不上的问题以及解决
  • 【Simulink专题】Simulink模型:MIL单元测试
  • 宝塔发布ktg-mes
  • vue cli 没使用的图片会被打包吗
  • 2025年08月27日Github流行趋势
  • 怎么更新 cargo.exe ?(Rust 工具链)
  • etcd-基本工作原理及部署
  • react + G2(v4) 应用
  • 【C++游记】模板升级
  • 飞腾 D2000 八核处理器板卡深度解析:全国产化硬件方案与丰富扩展能力
  • Linux中创建SFTP账号