Python学习笔记·第17天:让数据“落地生根”——文件操作与数据持久化
·
一、文件操作基础
1. 为什么需要文件操作?
之前写的程序,数据在运行结束后就消失了。实际开发中,需要将数据存储到硬盘上,实现持久化保存。
2. 文本文件 vs 二进制文件
| 类型 | 存储方式 | 能否用记事本打开 | 常见格式 |
|---|---|---|---|
| 文本文件 | 普通字符(unicode) | 能 | .txt、.py、.csv |
| 二进制文件 | 字节 | 不能 | .mp4、.mp3、.jpg、.doc |
3. 文件打开模式
| 模式 | 描述 |
|---|---|
r |
读模式 |
w |
写模式(文件不存在则创建,存在则覆盖) |
a |
追加模式(文件不存在则创建,存在则在末尾追加) |
b |
二进制模式(可与r/w/a组合,如rb、wb) |
+ |
读写模式(可与r/w/a组合,如r+) |
二、文本文件写入
1. 基本三步走
# 1. 创建文件对象
f = open('hello.txt', 'w')
# 2. 写入数据
f.write('itYus\next\n')
# 3. 关闭文件
f.close()
2. 中文乱码问题
Windows默认编码是GBK,Linux是UTF-8。写入中文时需要指定编码:
f = open(r"b.txt", "w", encoding="utf-8")
f.write("云生\n云生\n")
f.close()
3. with语句(推荐写法)
with 语句能自动管理资源,无论是否发生异常,都会自动关闭文件。
str = ["云生", "云生", "云生"]
with open("b.txt", "w", encoding="utf-8") as f:
f.writelines(str)
对比:
| 写法 | 优点 | 缺点 |
|---|---|---|
f = open(); ...; f.close() |
灵活 | 容易忘记关闭,异常时不安全 |
with open() as f: |
自动关闭,异常安全 | — |
三、文本文件读取
1. 三种读取方法
| 方法 | 作用 | 示例 |
|---|---|---|
read(size) |
读取指定字符数,省略则读取全部 | f.read(4) |
readline() |
读取一行 | f.readline() |
readlines() |
每行作为元素存入列表返回 | f.readlines() |
2. 读取示例
# 读取前4个字符
with open("b.txt", "r", encoding="utf-8") as f:
print(f.read(4))
# 一次读取整个文件
with open("b.txt", "r", encoding="utf-8") as f:
print(f.read())
# 逐行读取
with open("b.txt", "r", encoding="utf-8") as f:
while True:
line = f.readline()
if not line:
break
print(line, end="")
四、二进制文件读写
处理图片、视频等非文本文件时,需要指定二进制模式。
# 复制图片(二进制读取 + 二进制写入)
with open('5.jpg', 'rb') as srcFile, open("copy.png", 'wb') as desFile:
for line in srcFile:
desFile.write(line)
五、文件对象的常用属性和方法
1. 文件属性
| 属性 | 说明 |
|---|---|
name |
返回文件名 |
mode |
返回打开模式 |
closed |
文件是否已关闭(布尔值) |
2. 常用方法
| 方法 | 说明 |
|---|---|
read(size) |
读取指定字符/字节数 |
readline() |
读取一行 |
readlines() |
每行作为列表元素返回 |
write(str) |
将字符串写入文件 |
writelines(list) |
将字符串列表写入文件(不自动加换行) |
seek(offset, whence) |
移动文件指针(0开头/1当前/2末尾) |
tell() |
返回当前指针位置 |
flush() |
将缓冲区内容写入文件但不关闭 |
close() |
写入缓冲区并关闭文件 |
3. seek()移动文件指针示例
with open("hello.txt", "r", encoding="utf-8") as f:
print(f.tell()) # 当前指针位置
print(f.readline()) # 读取一行
print(f.tell()) # 指针已移动
f.seek(0) # 指针回到开头
print(f.readline()) # 再次读取第一行
六、pickle序列化
序列化:将对象转换为可存储或传输的格式。
反序列化:将存储的数据恢复为对象。
import pickle
# 序列化(存储)
with open("data.dat", "wb") as f:
name = "iwen"
age = 34
resume = {'name': name, 'age': age, 'score': [90, 80, 70]}
pickle.dump(resume, f)
# 反序列化(读取)
with open("data.dat", "rb") as f:
resume = pickle.load(f)
print(resume) # {'name': 'iwen', 'age': 34, 'score': [90, 80, 70]}
七、CSV文件操作
CSV是逗号分隔值文件,常用于数据交换和表格数据处理。
1. 读取CSV
import csv
with open("list.csv") as csvfile:
reader = csv.reader(csvfile)
header = next(reader) # 读取标题行
print(header)
for row in reader: # 逐行读取数据
print(row)
2. 写入CSV
import csv
headers = ["姓名", "年龄", "工作", "薪资"]
rows = [
('yus', '20', '北京', '22'),
('yus', '20', '北京', '22')
]
with open("list.csv", "w", encoding="utf-8", newline="") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(headers) # 写入标题行
writer.writerows(rows) # 写入多行数据
注意:Windows下写入CSV时,建议加上
newline=""避免出现多余空行。
八、OS模块
os模块可以直接与操作系统交互,执行文件/目录操作或调用系统命令。
1. 调用系统命令
import os
os.system("calc.exe") # 打开计算器
os.system("ping www.baidu.com") # 执行ping命令
os.startfile("微信路径") # 直接运行可执行文件
2. 文件和目录操作
| 方法 | 说明 |
|---|---|
os.remove(path) |
删除文件 |
os.rename(src, dest) |
重命名文件或目录 |
os.stat(path) |
返回文件属性 |
os.listdir(path) |
列出目录下的文件和子目录 |
os.mkdir(path) |
创建单级目录 |
os.makedirs(path) |
创建多级目录 |
os.rmdir(path) |
删除目录 |
os.removedirs(path) |
删除多级目录 |
os.getcwd() |
返回当前工作目录 |
os.chdir(path) |
切换工作目录 |
3. 常用属性
| 属性 | 说明 |
|---|---|
os.name |
操作系统类型(nt=Windows, posix=Linux) |
os.sep |
路径分隔符(Windows为\,Linux为/) |
os.linesep |
换行符(Windows为\r\n,Linux为\n) |
今日核心总结
- 文件写入三步骤:
open()→write()/writelines()→close() - 推荐使用
with语句:自动管理文件关闭,防止资源泄漏 - 中文编码:写入中文时指定
encoding="utf-8" - 三种读取方法:
read()(全部/指定字符)、readline()(一行)、readlines()(列表) - 二进制模式:处理图片/视频时加
b,如rb、wb - pickle序列化:将Python对象存入文件,读取时恢复为对象
- CSV操作:
csv.reader()读取,csv.writer()写入,注意Windows加newline="" - OS模块:调用系统命令、管理文件和目录、获取系统信息
更多推荐

所有评论(0)