文件编码
编码是一种“翻译规则”,用于实现 文本内容 ↔ 二进制数据 的相互转换。
计算机只能识别 0 和 1,而我们的文字、符号、文件内容都必须经过编码才能被存储和读取。
什么是编码?
PDF 第 1 页中的两张图展示了文本如何变成二进制(文字化如下):
图示 1(页面 1 图示文字化):
我 喜 欢 你
↓ ↓ ↓ ↓
编码 → 1011 1101 1111 1001
不同编码方式会把同样的内容翻译成不同的二进制序列。
常见编码
图示强调了一些常见编码方式:
- UTF-8(全球通用、最推荐)
- GBK(中文编码)
- Big5(繁体中文编码)
不同编码方式就像不同的“密码本”,同样的文字在不同编码中对应的二进制不同。
编码与解码必须一致
PDF 图示 2(页面 1 下方)说明:
使用编码A翻译成二进制 → 解码时必须使用编码A
否 则 → 得到乱码
因此阅读文件时一定要知道文件采用的编码方式。
实际开发中建议
- 除非有特殊需求,一律使用 UTF-8 编码格式。
文件操作概念引入
PDF 第 1 页底部说明了文件操作的核心流程:
- 打开文件
- 关闭文件
- 读取内容
- 写入内容
并强调:
Python 文件与 txt 文件在同一目录时可直接写文件名读取,否则必须写绝对路径(更推荐)。
示例来自 PDF(文字化):
f = open("2011年1月销售数据.txt", "r", encoding="UTF-8")
print(f.read())
文件的打开
Python 使用 open() 函数来打开文件,无论是读取已有文件,还是创建新文件,都需要通过它来“建立连接”。
open() 的基本语法
open(name, mode, encoding)
参数说明:
- name:文件路径(可写相对路径,也可写绝对路径)
- mode:文件打开模式,例如只读、写入、追加等
- encoding:编码格式(推荐 UTF-8)
PDF 示例(页面 2):
f = open("C:/code/bill.txt", "r", encoding="UTF-8")
注意事项:
- encoding 参数不是第三位,不能用位置参数,只能用关键字参数指定。
- open() 返回一个 文件对象,可通过该对象的属性和方法对文件进行操作。
文件路径的书写
PDF 图示说明:
- 如果 txt 文件与 Python 文件在 同一目录 → 直接写文件名即可
- 不在同一目录 → 必须写相对路径或绝对路径(推荐使用绝对路径)
图示 1(页面 1 图像内容文字化):
pyspark入门/
├─ orders.txt
├─ search_log.txt
├─ test01.py
└─ test02.py
Python 文件与 txt 文件不在同一目录,必须写完整路径读取
示例(来自图示):
f = open("C:/code/pythonDemo/pyspark入门/orders.txt", "r", encoding="UTF-8")
print(f.read())
文件打开模式(mode)
PDF 表格(页面 2)总结了三种最常用的模式:
| 模式 | 描述 |
|---|---|
| r | 只读方式打开文件,指针在文件开头(默认模式) |
| w | 写入模式。若文件存在,则覆盖原内容;若不存在,则创建新文件 |
| a | 追加模式。若文件存在,将内容写入文件尾部;若不存在,则创建新文件 |
补充说明:
- 新手建议:路径尽量写绝对路径,减少错误。
一次打开文件的代码结构
PDF 示例:
f = open("C:/code/bill.txt", "r", encoding="UTF-8")
print(f.read())
步骤:
open()打开文件 → 获得文件对象f- 通过
f.read()读取内容 - 操作完成后需关闭文件(close 将在下一章详细讲)
文件的读取
文件读取常见场景包括:
- 读取全部内容
- 分行读取
- 按字节数读取
- 循环逐行读取
PDF 中总结了所有读取方式,并强调重要细节:
每次读取都会从上一次结束的位置继续;文件内容只能在一次 open() 中读一次。
read() —— 读取全部或指定长度内容
语法:
文件对象.read(num)
- num 未指定 → 读取整个文件内容
- num 指定 → 读取 num 字节的数据
示例(PDF page 3):
f = open("C:/code/test.txt", "r", encoding="UTF-8")
content = f.read()
print(content)
# 输出:
# 观止
# study
读取指定字节:
f = open("C:/code/test.txt", "r", encoding="UTF-8")
content = f.read(2)
print(content)
# 输出:
# 观止
图片内容转文字
示意图说明了逐次读取的行为:
文件内容:hello world(共 11 字节)
第一次:read(6) → hello
第二次:read(6) → world
第三次:read(6) → (空,因为内容已读完)
说明:
read 是连续读取,每次读取后文件指针向后移动。
readline() —— 读取一行
语法:
文件对象.readline()
示例:
f = open("C:/code/test.txt", "r", encoding="UTF-8")
content = f.readline()
print(f"第一行内容:{content}")
content = f.readline()
print(f"第二行内容:{content}")
输出:
第一行内容:观止
第二行内容:study
readlines() —— 读取所有行返回列表
语法:
文件对象.readlines()
示例:
f = open("C:/code/test.txt", "r", encoding="UTF-8")
content = f.readlines()
print(content)
print(type(content))
输出:
['观止\n', 'study']
<class 'list'>
for 循环读取每一行
文件对象可以直接用于 for 循环,逐行读取:
for line in open("C:/code/test.txt", "r", encoding="UTF-8"):
print(line)
输出(带空行是因为每一行结尾已有换行符):
观止
study
关闭文件:close()
如果不调用 close 且程序未退出:
- 文件将一直被占用
- 无法删除 / 覆盖 / 重命名该文件
示例:
f = open("C:/code/test.txt", "r", encoding="UTF-8")
# ...执行文件操作
f.close()
PDF page 4 图示说明:
错误提示:文件正在使用,因此无法完成操作
原因:文件未关闭,被 Python 程序占用
with open() —— 自动关闭文件
推荐方式,避免忘记 close。
语法:
with open(path, mode, encoding) as f:
f.readlines()
示例(PDF page 5):
with open("C:/code/test.txt", "r", encoding="UTF-8") as f:
f.readlines()
特点:
- 离开 with 代码块后自动 close
- 即使出现异常也能正常关闭文件
文件的写入
写入文件常见于保存日志、导出结果、生成数据文件等场景。
PDF 特别强调两个关键点:
- w 模式会清空文件再写入
- write 写入后内容不会立即落盘,需 flush 或 close 刷新
写入示例
f = open("C:/code/test.txt", "w")
# 文件不存在 → 自动创建
# 文件存在 → 内容会被清空(重要!)
f.write("hello world")
f.flush() # 刷新,把内容真正写入硬盘
write() 不会立即写入硬盘(缓冲区机制)
明确指出:
- write 写入的数据会 先存入内存缓冲区
- flush() 或 close() 才会真正写入文件
- 这样做是为了减少频繁写磁盘,提高性能
图示:
编辑 test.txt → 已写入 "hello world"
如果没有 flush 或 close,则文件可能暂时仍为空
刷新后才会看到内容真正写入文件
close() 会自动 flush
close() 做了两件事:
- 刷新缓冲区,将内容写入文件
- 释放文件资源(否则文件被占用)
因此以下写入方式也是正确的:
f = open("C:/code/test.txt", "w")
f.write("hello world")
f.close() # 自动刷新并关闭
推荐写法:with open 写入
with 会自动 close,自然包含 flush:
with open("C:/code/test.txt", "w", encoding="UTF-8") as f:
f.write("hello world")
这是生产环境中最常用的文件写入方式。
文件的追加写入(append 模式)
写入文件时,如果你希望 不覆盖原内容,而是向文件尾部追加新内容,则需要使用 "a" 模式。
追加模式 a 的特点
- 文件不存在 → 自动创建新文件
- 文件存在 → 新写入内容会追加到末尾,而不会清空原内容
- write() 后仍然需要 flush() 或 close() 才会真正写入硬盘
与 "w" 模式相比:
| 模式 | 文件不存在 | 文件存在时行为 |
|---|---|---|
| w | 创建文件 | 清空原内容 再写入 |
| a | 创建文件 | 保留原内容 在尾部追加 |
使用示例(来自 PDF page 6)
f = open("C:/code/test.txt", "a")
# 写入内容
f.write("study")
# 刷新缓冲区,真正写入硬盘
f.flush()
若 test.txt 原内容为:
hello world
执行上方代码后:
hello worldstudy
若想换行追加,可写:
f.write("\nstudy")
追加模式的使用场景
- 日志系统持续追加日志
- 数据记录不断写入文件
- 不希望每次覆盖原数据的情况
Python 文件操作总结
本章总结了 Python 处理文件时常用的所有知识点,包括编码、文件打开、读取、写入、追加写入、文件关闭方式等。
以下为 PDF 思维导图内容的完整文字版。
文件编码
编码是一种“翻译规则”,用于实现:
文本内容(例如:我喜欢你)
↓ 使用编码(UTF-8 / GBK / Big5)
二进制数据(0101 1100 1011 ...)
关键要点:
- 计算机只能识别 0 和 1 → 编码用于转化文本
- 编码与解码必须一致,否则会出现乱码
- 推荐统一使用 UTF-8(全球通用编码)
文件的打开
文件在操作前必须打开,通过 open() 完成:
open(name, mode, encoding="UTF-8")
常用模式:
| 模式 | 含义 |
|---|---|
| r | 只读(默认) |
| w | 写入(会清空原文件) |
| a | 追加(在末尾追加内容) |
路径建议使用“绝对路径”避免错误。
文件的读取
读取会从文件指针当前位置开始,因此每次读取后指针都会向后移动。
常用方法:
| 方法 | 功能 |
|---|---|
| read(num) | 读取指定字节数;不写 num 则读取全部内容 |
| readline() | 读取一行 |
| readlines() | 按行读取全部内容 → 返回列表 |
| for line in 文件对象 | 逐行读取(最常用方式之一) |
文件读完后必须 close,否则文件会被占用不能修改。
自动关闭文件的方式
使用 with open() 可以自动 close:
with open("test.txt", "r", encoding="UTF-8") as f:
data = f.readlines()
特点:
- 自动释放文件资源
- 即使代码出错也能正常关闭文件
是最推荐的文件读取形式。
文件的写入
写入时内容不会立即写入磁盘,而是存入 缓冲区:
write() → 写入内存(缓冲区)
flush() / close() → 真正写入文件
写入方式:
f = open("test.txt", "w")
f.write("hello world")
f.flush()
使用 "w" 模式会直接清空原内容。
文件的追加写入
如果希望保留原文件内容,在末尾追加新内容,应使用 "a" 模式:
f = open("test.txt", "a")
f.write("study")
f.flush()
追加模式特点:
- 不会清空原内容
- 文件不存在会自动创建
- 常用于日志持续写入场景
核心流程总结
完整文件操作流程:
1. 打开文件(open)
2. 读取 / 写入 / 追加等操作
3. 刷新缓冲区(flush)可选
4. 关闭文件(close)或使用 with 自动关闭
一句话总结文件操作
- 读文件用:
read / readline / readlines / for - 写文件用:
w + write + flush - 追加写入用:
a + write + flush - 推荐用法:with open(…) as f:自动关闭文件