在 Python 中,文件操作是非常常见的任务。Python 提供了内置的函数来处理文件的读写操作。
文件的类型
- 文本文件:包含可读的字符(如
.txt、.csv)。一般使用 UTF-8 编码,可以使用文本编辑器查看。 - 二进制文件:包含非文本数据(如图像、音频、视频文件,后缀如
.jpg、.png、.mp3)。以原始==字节格式==存储。需要使用专用软件查看,Bytes形式存储。
==注意==:后缀名不会影响文件类型 .md | .txt |.csv 都是文本文件
文件操作的过程
- 打开文件
- 读写文件
- 读文件:将文件内容读入内存
- 写文件:将内存内容写入文件
- 关闭文件
操作方法
文件路径
- 绝对路径:从根路径开始描述文件的位置,例如:
F:技术文件课件-笔记课件修订Python1.Python基础语法,具有唯一性,不会出错,不管写在哪里都可以准确的找到文件的位置 - 相对路径:相对当前位置进行文件定位,容易出错,需要对路径比较熟悉
==注意==:会相对路径就可,到时候linux会重新搞
txt.path=Path(__file__).parent #获取当前运行程序脚本文件的上一级文件夹路径,方便后续定位文件夹里的其他脚本文件,如当前为.py,可以找所在文件夹的其他文件.txt
# 后径路径拼接..
#Path(__file__).parent 相当于文件夹路径被定死可以在任何程序文件运行
with open(‘ 文件名’,’方式’,’编码 ‘)
使用 with 语句可以自动管理文件的打开和关闭,with 语句打开后自动关闭文件
with open('example.txt', 'r') as file: # 获取file文件对象
content = file.read()
==注意==:在windows系统自动关闭后文件不会被占用,可删除或重命名
以不同模式打开
| 访问方式 | 说明 |
|---|---|
r |
以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。如果文件不存在,报错 |
a |
以追加方式打开文件。如果该文件已存在,文件==指针==将会放在==文件的结尾==。如果文件不存在,创建新文件进行写入 |
r+b |
以二进制读写方式打开。文件指针在开头,可读可写,文件必须存在 |
a+b |
以二进制读写方式打开。文件指针在末尾,追加写入,可读全文,不存在则创建 |
==注意==:对于==二进制文件binary==,只能使用 b 模式,表示以 bytes 方式操作(所有文件本质上最终都是字节存储,使用这种模式无需考虑文本文件的字符编码),读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
r 和 a 以 字符串Str形式读写
文件编码
由操作系统打开文件,那么如果我们没有指定编码,那么打开文件的默认编码取决于操作系统,操作系统会用自己的默认编码去打开文件,在 Windows 下是 gbk,在 Linux 下是 utf-8。
with open('example.txt','r',encoding='utf-8') as file:
==注意==:file是==文件对象==:代表打开的文件
读取文件
read(size):读取指定大小的内容,如果没有指定,读取全部内容。readline():读取一行。readlines():读取所有行并返回一个列表。
==注意==:size 标准为 8192(8 k b) 读写磁盘大文件 64kb
示例:
with open('example.txt','r',encoding='utf-8') as file:
content = file.read() # 读取全部内容
line = file.readline() # 读取一行
lines = file.readlines() # 读取所有行
print(content)
print('-----------')
print(line)
print('-----------')
print(lines)
# 思考?
# 为什么后面两个print读取不到东西呢?
==注意==:光标读到哪就放到哪不会重置开头,读完返回空字符串 ‘ ‘ 或 空列表 [ ]
文件指针
用 seek(0) 来操作指针,重置光标位置
语法:
file.seek(0)
-
括号里
(可选):指定光标基准位置,可以取以下值:
0:从文件开头开始计算(默认值)1:从当前位置开始计算2:从文件末尾开始计算
示例:
with open('example.txt','r',encoding='utf-8') as file:
content = file.read() # 读取全部内容
file.seek(0) # 把光标移到到文件的开头
line = file.readline() # 读取一行
file.seek(0) # 再次把光标移动到文件的开头
lines = file.readlines() # 读取所有行
print(content)
print('-----------')
print(line)
print('-----------')
print(lines)
按行读取文件内容
read()默认会把文件的所有内容一次性读取到内存readline()可以一次读取一行内容
# 方式一、 通过循环按行读取文件所有内容
file1 = open("example.txt")
i = 1
while True:
text1 = file1.readline().strip()
if text1:
print("这是第%s行内容" % i)
i += 1
print(text1)
else:
break
file1.close()
file2 = open("example.txt")
# 通过for循环遍历按行读取文件所有内容
for i in file2.readlines():
print(i.strip())
file2.close()
写入内容
用 file.write( ) 写入内容
语法:
file.write( )
示例:日记记录
# 日记程序
# 以追加模式打开日记文件
with open('diary.txt', 'a',encoding='utf-8') as file:
# 获取用户输入的日记内容
content = input("请输入今天的日记:")
# 将日记内容写入文件
file.write(content + "n")
print("日记已保存!")
案例:简单的备份程序
将一个文本文件的内容复制到另一个文件,用于简单的备份。
# 简单备份小程序
'a.txt'
'b.txt'
with open('a.txt','r',encoding='utf-8') as src:
content = src.read()
with open('b.txt', 'a',encoding='utf-8') as dest: # 以追加方式打开文件'b.txt'
dest.write(content)
print(f"备份成功!'a.txt' 的内容已复制到 'b.txt'")
Json 文件读取
json本质上是文本格式,为” ……… “,引号里是python的所有脚本.
| JSON类型 | Python类型 |
|---|---|
| object | dict |
| array | list |
| string | str |
| number(整形)int | int |
| number(浮点型)float | float |
| true | True |
| false | False |
| null | None |
转换方法
| 作用 | 输出 |
|---|---|
| json.dumps() | 将 Python 对象序列化为 JSON 字符串 obj → str |
| json.dump() | 将 Python 对象序列化为Json格式并写入文件( obj, filename,encoding=utf-8) → 无返回值 |
| json.loads() | 将 JSON 字符串反序列化为 Python 对象 str → obj |
| json.load() | 从文件读取并反序列化为 Python 对象 (filename) → obj |
==注意==:区别在于数据来源或去向:带s的是处理字符串(在内存中操作),没有写入文件 ;没有s的是处理文件对象,读写文件内容
dump把写的代码转为json格式写到文件里,load是从 Json文件读取到 python 程序中.
序列化和反序列化
序列化:从 Python 到 JSON
反序列化: 从 JSON 到 Python
文件读写操作
- 把data以json格式写入到文件
data = {"result": "success", "code": 200}
with open("output.json", "a", encoding="utf-8") as f:
json.dump(data, f)
- 把json文件里的东西读取到python里,去掉 ” “
with open("output.json", "r", encoding="utf-8") as f:
data = json.load(f)
JSON 与 bytes 的 转换
JSON 本质文本格式为str,转换成字节才可在二进制里运行
- 编码与解码
- Json 到 bytes:先 Python 对象 变成 JSON 字符串(dumps),再通过.encode( )编码成字节形式
- bytes 到 Json:先将字节通过decode( )解码成字符串,再 loads( )解码成Python对象
==注意==:一切都是围绕str到bytes的编解码
转换路线
| 方向 | 步骤 |
|---|---|
| Python对象到bytes | obj到JSON字符串再到bytes |
| bytes到Python对象 | bytes到JSON字符串再到obj |
import json
data = {"action": "login", "user": "张三", "ts": 1234567890}
# === 对象 → bytes ===
json_bytes = json.dumps(data, ensure_ascii=False).encode("utf-8")
print(json_bytes) # b'{"action":"login","user":"张三","ts":1234567890}'
# === bytes → 对象 ===
recovered = json.loads(json_bytes.decode("utf-8"))
print(recovered["user"]) # 张三
读写二进制Json文件
手动编码后写入,读取时先解码
- 写入二进制 Json文件
data = {"sensor": "temp", "value": 23.5}
with open("data.bin", "wb") as f:
# 将对象转为 bytes 后写入
f.write(json.dumps(data, ensure_ascii=False).encode("utf-8"))
- 读取二进制文件
with open("data.bin", "rb") as f:
raw_bytes = f.read() # 先把读取的内容写到内存上来,不然没有目标
obj = json.loads(raw_bytes.decode("utf-8"))
Base64:把图片,音视频等二进制转入JSON存储
json不能存储真正二进制内容,==须先用Base64编码成字符串==,字符串可安全放入JSON字符串字段里
典型JSON结构示例:
{
"fileName": "photo.jpg",
"mimeType": "image/jpeg",
"data": "/9j/4AAQSkZJRgABAQEBLAEsAAD..."
}
图片,音视频都是二进制形式

==注意==:Base64编码返回永远是字节,所以必须.decode()去掉b得到字符串;b64decode解码自动处理字符串去掉字符串标识,把字符串还原为二进制得到原本的b,b64decode解码直接把字符串传进去
· 编码:base64.b64encode(二进制数据) → 返回 bytes(例如 b’data’) 如果你想要 str(文本字符串),需要再调用 .decode(‘utf-8’)。 所以确实“不是直接转的,需要多一步 decode”。 · 解码:base64.b64decode(字符串) → 返回原始 bytes。 它可以接受 str 参数(如 ‘….’),不需要你先 encode 成 bytes。 所以解码时“可以直接转”。
你的理解完全正确,而且区分了编码和解码的不同处理方式。简洁准确地概括了 Python base64 模块的行为👍
ru