1. 文件是什么?
文件是以计算机硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等。计算机文件基本上分为两种:
- 二进制文件:没有统一字符编码(图片/音频/视频/可执行文件等)
- 纯文本文件:有统一编码(可视为存储在磁盘上的长字符串)
常见纯文本编码:ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。实践中处理文本文件通常选 UTF-8。
典型 I/O 流程:打开 → 读/写 → 刷新/移动指针 → 关闭
2. open() 打开文件与关闭文件
2.1 open 基本语法与参数
| |
file_path:文件路径(相对/绝对)mode:读写模式(见下一节)encoding:文本编码(建议显式指定utf-8)errors:编码/解码错误处理策略newline:换行符处理(写 CSV 常用newline='')closefd/opener:高级参数,通常不需要
2.2 推荐用法:with 自动关闭
| |
2.3 手动关闭:close()
| |
3. 文件读写模式
| 模式 | 含义 |
|---|---|
| r | 只读(默认,文件必须存在,不存在抛异常) |
| w | 只写,写之前清空文件内容;文件不存在则创建 |
| a | 追加写,文件指针在末尾;文件不存在则创建 |
| r+ | 可读可写(文件必须存在) |
| w+ | 读写(覆盖);文件不存在则创建 |
| a+ | 读写(追加);文件不存在则创建 |
| rb | 二进制只读 |
| wb | 二进制只写(覆盖) |
| ab | 二进制追加 |
| rb+ | 二进制可读可写 |
| wb+ | 二进制读写(覆盖) |
| ab+ | 二进制读写(追加) |
4. 文件对象常用方法
| 分类 | 方法 | 说明 | 示例 |
|---|---|---|---|
| 打开文件 | open(file, mode='r', ...) | 返回文件对象 | file = open('example.txt', 'r') |
| 读取 | read(size=-1) | 读取整个文件或指定大小 | content = file.read() |
| 读取 | readline(size=-1) | 读取一行 | line = file.readline() |
| 读取 | readlines(hint=-1) | 读取全部行 → 列表 | lines = file.readlines() |
| 写入 | write(string) | 写入字符串/bytes | file.write('Hello\\n') |
| 写入 | writelines(lines) | 写入多行(不自动加换行) | file.writelines(['a\\n','b\\n']) |
| 指针 | seek(offset, whence=0) | 移动文件指针 | file.seek(0) |
| 指针 | tell() | 返回当前指针 | pos = file.tell() |
| 缓冲 | flush() | 刷新缓冲区 | file.flush() |
| 关闭 | close() | 关闭文件 | file.close() |
| 上下文 | with open(...) as f: | 自动管理打开/关闭 | with open(...) as f: ... |
| 二进制 | open(file, 'rb') | 二进制读 | with open('a.png','rb') as f: |
5. 读取文件(read / readline / readlines)
5.1 read:读取全部内容
| |
5.2 readline:逐行读取
| |
逐行读取整个文件:
| |
5.3 readlines:一次性读取全部行
| |
5.4 readlines vs readline
readlines():一次性读取所有行 → 列表,适合小文件readline():一次读取一行,适合大文件逐行处理,内存占用更小
5.5 大文件读取建议
| |
6. 写入文件(write)
6.1 写入文本文件
| |
6.2 写入 CSV 文件
| |
6.3 写入 JSON 文件
| |
6.4 写入数据库(以 sqlite3 为例)
| |
7. 从文件/数据库读取数据(含示例)
7.1 读取 CSV
| |
7.2 读取 JSON
| |
7.3 从数据库读取(sqlite3)
| |
8. 二进制文件操作
| |
9. 文件指针与缓冲(seek / tell / flush)
| |
seek(offset, whence=0):改变指针位置,whence=0/1/2对应 开头/当前位置/末尾tell():返回指针当前位置flush():把缓冲区数据立即写入磁盘
10. 使用 os 与 pathlib 进行文件/目录操作
10.1 os 常用
| |
10.2 pathlib 常用
| |
11. 文件相关管理操作(重命名/删除/创建/当前目录)
11.1 文件重命名(含异常处理)
| |
高级:正则批量生成新名称:
| |
11.2 删除文件
| |
11.3 创建文件
| |
11.4 获取当前目录
| |
12. 示例脚本
12.1 目录.txt 自动清洗
规则:
- 二级标题行前空 4 个格子(一级标题不加)
- “章/节” 后加空格
- 页码前加
=>
| |
12.2 批量修改文件夹下文件命名(补齐前缀)
| |
12.3 检测同级目录下是否存在同名文件夹(前 5 位重复)
| |
13. 安全与健壮性
- 文本文件尽量显式指定
encoding='utf-8' - 读取/写入时根据需要设置
errors='ignore'/'replace' - 写 CSV 建议
newline='' - 原子写入:临时文件写完再替换,避免半成品
| |
14. 小结
- 基础:
with open(path, 'r/w/a', encoding='utf-8') - 大文件:优先逐行/分块,不要一次
read()全部 - CSV:写入
newline='' - JSON:写入
ensure_ascii=False+indent - 二进制:加
b(rb/wb/ab) - 目录/路径:
pathlib.Path更顺手
