13.Python的文件与IO操作:从基础到实战

59 阅读3分钟

@[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):

IDNameDepartmentSkills
101AliceEngineering["Python","C"]
102BobMarketing["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的迭代器与生成器:懒加载与内存优化的艺术 内容亮点

  1. 深度解析iter()next()底层机制
  2. 💡 生成器妙用:用yield实现惰性计算,处理超大数据流
  3. 🚀 实战场景
    • 无限斐波那契数列生成
    • 大文件分块读取优化
    • 异步编程基础(协程初步)

进一步学习

思考题:如何将多个JSON文件合并为一个CSV?尝试用本文知识实现,答案下期揭晓!

更多技术干货欢迎关注微信公众号“科威舟的AI笔记”~

【转载须知】:转载请注明原文出处及作者信息