@[toc]
Python的文件与IO操作:从基础到实战
文件操作是Python数据处理的核心技能,本文涵盖文本/二进制读写、CSV/JSON解析,并通过一个Excel转JSON工具实战帮你巩固技能。所有代码兼容Python 3.8+。
1. 文本/二进制文件读写(with上下文管理)
关键点:安全操作文件资源,避免资源泄漏。
1.1 基础操作模式
# 文本文件读写(自动处理编码)
with open('demo.txt', 'w', encoding='utf-8') as f: # 写模式
f.write("Hello,世界\n第二行内容")
with open('demo.txt', 'r') as f: # 读模式
print(f.read()) # 输出整个文件内容
# 二进制文件读写(图片/音视频)
with open('image.jpg', 'rb') as f: # 二进制读
data = f.read()
with open('copy.jpg', 'wb') as f: # 二进制写
f.write(data) # 复制图片文件
1.2 模式选择指南
| 模式 | 说明 | 是否覆盖 |
|---|---|---|
'r' | 只读文本(默认) | - |
'w' | 写入文本(清空原内容) | ✅ |
'a' | 追加文本 | ❌ |
'rb' | 二进制只读 | - |
'wb' | 二进制写入(清空) | ✅ |
1.3 高效处理大文件
# 逐行读取(内存友好)
with open('large.log', 'r') as f:
for line in f: # 每次只读一行到内存
process(line) # 自定义处理函数
# 分块读取(100KB/次)
with open('video.mp4', 'rb') as f:
while chunk := f.read(102400): # 每次读取100KB
save_chunk(chunk)
2. CSV/JSON解析(csv/json模块)⭐️
2.1 CSV文件读写
import csv
# 写入CSV
with open('data.csv', 'w', newline='') as f: # newline=''防空行
writer = csv.writer(f, delimiter=',')
writer.writerow(['Name', 'Age', 'City'])
writer.writerow(['Alice', 25, 'New York'])
writer.writerows([ # 批量写入多行
['Bob', 30, 'Los Angeles'],
['Charlie', 35, 'Chicago']
])
# 读取CSV(字典形式)
with open('data.csv', 'r') as f:
reader = csv.DictReader(f) # 自动解析表头
for row in reader:
print(f"{row['Name']} lives in {row['City']}")
2.2 JSON高级操作
import json
# 字典 → JSON字符串
data = {"name": "Alice", "skills": ["Python", "SQL"]}
json_str = json.dumps(data, indent=2) # indent美化缩进
print(json_str)
# JSON文件 → Python对象
with open('data.json', 'r') as f:
data = json.load(f) # 自动解析为字典/列表
print(data['skills'][0])
# 处理复杂对象(日期/自定义类)
def custom_encoder(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError("Unsupported type")
json.dumps(event, default=custom_encoder) # 自定义序列化
3. 实战:Excel数据转JSON工具
需求:将Excel表格转换为嵌套JSON,支持多层级数据结构。
输入文件 (input.xlsx):
| ID | Name | Department | Skills |
|---|---|---|---|
| 101 | Alice | Engineering | ["Python","C"] |
| 102 | Bob | Marketing | ["SEO","PPT"] |
输出JSON (output.json):
[
{
"ID": 101,
"Name": "Alice",
"Department": "Engineering",
"Skills": ["Python", "C"]
},
{
"ID": 102,
"Name": "Bob",
"Department": "Marketing",
"Skills": ["SEO", "PPT"]
}
]
代码实现:
import openpyxl # 需安装:pip install openpyxl
import json
def excel_to_json(excel_path, json_path):
wb = openpyxl.load_workbook(excel_path)
sheet = wb.active
# 获取标题行
headers = [cell.value for cell in sheet[1]]
data = []
for row in sheet.iter_rows(min_row=2, values_only=True): # 跳过标题行
row_data = {}
for idx, value in enumerate(row):
key = headers[idx]
# 处理JSON格式的字符串(如Skills列)
if isinstance(value, str) and value.startswith('['):
try:
value = json.loads(value.replace("'", '"')) # 单引号转双引号
except json.JSONDecodeError:
pass # 保持原始字符串
row_data[key] = value
data.append(row_data)
with open(json_path, 'w') as f:
json.dump(data, f, indent=2)
excel_to_json('input.xlsx', 'output.json')
关键技巧:
- 使用
values_only=True直接获取单元格值,提升性能 - 自动检测并转换JSON格式的字符串(如
["Python","C"]) - 异常处理避免格式错误中断进程
下期预告:14.Python的迭代器与生成器:懒加载与内存优化的艺术 内容亮点:
- ✨ 深度解析:
iter()与next()底层机制 - 💡 生成器妙用:用
yield实现惰性计算,处理超大数据流 - 🚀 实战场景:
- 无限斐波那契数列生成
- 大文件分块读取优化
- 异步编程基础(协程初步)
进一步学习:
- [文件操作安全指南(citation:1)]
- [JSON与CSV互转高级技巧(citation:7)]
- openpyxl.readthedocs.io
思考题:如何将多个JSON文件合并为一个CSV?尝试用本文知识实现,答案下期揭晓!
更多技术干货欢迎关注微信公众号“科威舟的AI笔记”~
【转载须知】:转载请注明原文出处及作者信息