人工智能之编程进阶 Python高级:第六章 文件类模块

人工智能之编程进阶 Python高级

第六章 文件类模块


@

目录
  • 人工智能之编程进阶 Python高级
  • 前言
  • 一、csv 模块:读写 CSV 文件
    • 1. 写入 CSV
    • 2. 读取 CSV
  • 二、json 模块:处理 JSON 数据
    • 1. 基本用法
    • 2. 读写文件
  • 三、xml 处理:使用 xml.etree.ElementTree
    • 1. 解析 XML(从字符串或文件)
    • 2. 构建 XML
  • 四、io.StringIO / io.BytesIO:内存中的文件模拟
    • 1. StringIO(文本)
    • 2. BytesIO(二进制)
  • 五、pickle 模块:Python 对象序列化
    • 1. 基本用法
    • 2. 序列化到内存
  • 六、with 语句:上下文管理器(Context Manager)
    • 1. 文件操作(最常见)
    • 2. 支持多个资源
    • 3. 自定义上下文管理器
  • 七、模块对比与选型建议
  • 八、总结
  • 资料关注


前言

本文主要介绍和文件相关的模块,包括文件类型csv、json、xml,文件模拟在内存中创建的StringIO,数据的序列化与反序列化,以及最常见的上下文管理器with。


一、csv 模块:读写 CSV 文件

用于处理逗号分隔值(Comma-Separated Values) 文件,常用于表格数据导入导出。

1. 写入 CSV

import csv# 写入列表数据
with open('data.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['Name', 'Age', 'City'])        # 表头writer.writerow(['Alice', 30, 'New York'])writer.writerows([['Bob', 25, 'London'], ['Charlie', 35, 'Tokyo']])# 写入字典数据(推荐)
with open('data_dict.csv', 'w', newline='', encoding='utf-8') as f:fieldnames = ['Name', 'Age', 'City']writer = csv.DictWriter(f, fieldnames=fieldnames)writer.writeheader()writer.writerow({'Name': 'Alice', 'Age': 30, 'City': 'New York'})

2. 读取 CSV

# 读取为列表
with open('data.csv', 'r', encoding='utf-8') as f:reader = csv.reader(f)for row in reader:print(row)  # ['Alice', '30', 'New York']# 读取为字典(推荐)
with open('data_dict.csv', 'r', encoding='utf-8') as f:reader = csv.DictReader(f)for row in reader:print(row['Name'], row['Age'])  # Alice 30

✅ ​注意​:

  • 使用 newline='' 避免空行(Windows)
  • 指定 encoding='utf-8' 防止中文乱码

二、json 模块:处理 JSON 数据

用于​序列化/反序列化 JSON​(JavaScript Object Notation),是 Web API 和配置文件的通用格式。

1. 基本用法

import jsondata = {"name": "Alice","age": 30,"hobbies": ["reading", "coding"],"active": True,"balance": None
}# 序列化:Python → JSON 字符串
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)# 反序列化:JSON 字符串 → Python
parsed = json.loads(json_str)
print(parsed['name'])  # Alice

2. 读写文件

# 写入 JSON 文件
with open('config.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)# 读取 JSON 文件
with open('config.json', 'r', encoding='utf-8') as f:config = json.load(f)

🔑 ​参数说明​:

  • ensure_ascii=False:支持中文
  • indent=2:美化输出(适合人类阅读)
  • sort_keys=True:按键排序

⚠️ ​限制​:
JSON 不支持 setdatetime、自定义类等类型。需自定义 default 函数或预处理。


三、xml 处理:使用 xml.etree.ElementTree

Python 标准库提供轻量级 XML 解析器(​不验证 DTD/XSD​)。

1. 解析 XML(从字符串或文件)

import xml.etree.ElementTree as ETxml_data = '''
<bookstore><book id="1"><title>Python指南</title><author>张三</author><price>59.9</price></book><book id="2"><title>数据科学实战</title><author>李四</author><price>79.9</price></book>
</bookstore>
'''# 从字符串解析
root = ET.fromstring(xml_data)# 或从文件解析
# tree = ET.parse('books.xml')
# root = tree.getroot()# 遍历
for book in root.findall('book'):title = book.find('title').textauthor = book.find('author').textprice = float(book.find('price').text)book_id = book.get('id')  # 获取属性print(f"ID:{book_id} | {title} by {author} - ¥{price}")

2. 构建 XML

# 创建根元素
root = ET.Element("students")# 添加子元素
student = ET.SubElement(root, "student", id="101")
ET.SubElement(student, "name").text = "王五"
ET.SubElement(student, "grade").text = "A"# 写入文件
tree = ET.ElementTree(root)
tree.write("students.xml", encoding="utf-8", xml_declaration=True)

✅ ​优点​:内存占用小(适合大文件)
❌ ​缺点​:功能有限,复杂场景建议用 lxml(第三方库)


四、io.StringIO / io.BytesIO:内存中的文件模拟

在​内存中读写字符串或字节​,无需真实文件,常用于测试、缓存、API 响应。

1. StringIO(文本)

from io import StringIO# 写入内存
f = StringIO()
f.write("Hello, ")
f.write("World!")
content = f.getvalue()  # "Hello, World!"
f.close()# 读取内存
f = StringIO("Line 1\nLine 2\nLine 3")
for line in f:print(line.strip())
f.close()# with 语句自动关闭
with StringIO() as f:f.write("Test")print(f.getvalue())  # Test

2. BytesIO(二进制)

from io import BytesIO# 模拟二进制文件(如图片、PDF)
buffer = BytesIO()
buffer.write(b'\x89PNG\r\n\x1a\n')  # PNG 文件头
png_data = buffer.getvalue()
buffer.close()

✅ ​典型用途​:

  • 单元测试中模拟文件对象
  • 将数据直接传给需要 file-like object 的函数(如 pandas.read_csv(StringIO(...))

五、pickle 模块:Python 对象序列化

将​任意 Python 对象​(包括自定义类)序列化为二进制,用于保存/恢复程序状态。

1. 基本用法

import pickledata = {'users': ['Alice', 'Bob'], 'count': 42, 'flag': True}# 序列化到文件
with open('data.pkl', 'wb') as f:  # 注意:二进制模式 'wb'pickle.dump(data, f)# 从文件反序列化
with open('data.pkl', 'rb') as f:  # 'rb'loaded = pickle.load(f)print(loaded)  # {'users': ['Alice', 'Bob'], ...}

2. 序列化到内存

# 转为 bytes
serialized = pickle.dumps(data)
# 从 bytes 恢复
restored = pickle.loads(serialized)

⚠️ ​严重警告​:

  • 不要反序列化不可信来源的 pickle 数据!​(可执行任意代码)
  • pickle 不是跨语言格式(仅限 Python)
  • 不同 Python 版本可能不兼容

✅ ​适用场景​:
临时缓存、进程间通信(同一系统)、机器学习模型保存(如 joblib 基于 pickle)


六、with 语句:上下文管理器(Context Manager)

确保资源(如文件、锁、网络连接)​自动正确释放​,即使发生异常。

1. 文件操作(最常见)

# 自动关闭文件,无需 f.close()
with open('file.txt', 'r') as f:content = f.read()
# 文件在此处已关闭

2. 支持多个资源

with open('input.txt', 'r') as fin, open('output.txt', 'w') as fout:fout.write(fin.read().upper())

3. 自定义上下文管理器

class Timer:def __enter__(self):self.start = time.time()return selfdef __exit__(self, exc_type, exc_val, exc_tb):print(f"耗时: {time.time() - self.start:.2f}秒")with Timer():time.sleep(1)  # 耗时: 1.00秒

✅ ​核心优势​:

  • 避免资源泄漏(如忘记关闭文件)
  • 代码更简洁、安全
  • 自动处理异常后的清理

七、模块对比与选型建议

格式/模块 可读性 跨语言 安全性 适用场景
csv ✅ 高 ✅ 是 ✅ 安全 表格数据交换
json ✅ 高 ✅ 是 ✅ 安全 Web API、配置文件
xml ⚠️ 中 ✅ 是 ✅ 安全 企业级数据、文档
pickle ❌ 二进制 ❌ 否 危险 Python 内部对象持久化
StringIO 内存中模拟文件

八、总结

  1. 能用 JSON 就别用 pickle
    除非你百分百确定数据是你自己生成的,而且只在 Python 里用。不然 pickle 不光别人看不懂,还可能被用来搞坏事(比如执行恶意代码)。
  2. 打开文件一定要用 with
    这样不管程序跑没跑完、出没出错,文件都会自动关掉。省得忘了关,占着资源还容易出 bug。
  3. 记得加上 encoding='utf-8'
    特别是处理中文的时候,不加这个很容易乱码。加上就安心,一劳永逸。
  4. 读写 CSV 推荐用 DictReaderDictWriter
    用字典操作字段名(比如 row['name']),比记第几列直观多了,代码也更好读、好维护。
  5. XML 太复杂?试试 lxml
    标准库的 XML 功能比较基础。如果你要查节点、做转换或者验证结构,直接上 lxml,它支持 XPath,写起来爽很多。
  6. 千万别用 pickle 存密码、密钥这类敏感信息
    pickle 本质是“把代码存下来再运行”,反序列化时可能偷偷执行东西,安全风险很高!
  7. 写测试时,用 StringIO 模拟文件
    不用真在硬盘上建文件,直接在内存里读写,干净又快,测完就丢,特别适合单元测试。

资料关注

公众号:咚咚王

艺术二维码.png

《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen) 》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/970304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PQ v.Next Alpha阶段发布

Alpha 阶段的发布 1、新闻稿发布 我们的PQ v.Next v1.1.9版本顺利发布!PQ 是一款专为知识分享场景设计的AI驱动型互动平台。它旨在通过动态题目生成和即时反馈,将传统的单向演讲转变为一场沉浸式、可量化的双向交流,…

国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照框架中的深度应用

国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照框架中的深度应用2025-11-19 19:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; over…

三分稀疏图染色的多项式时间证明

别看(简介 三分图染色指对于一个图进行三种颜色的染色,每条边的两个端点颜色不同 本文旨解决 m-n$\le$7的染色问题,即边数只比点数多7 做法 考虑对于每个度数$\ge$3的结点作暴力dfs染色,代码差不多就是这样的 即能…

251119

JT-JY14T3S1Hello, FL conference hotel. Hi, i want to ask about conference facilities of the hotel. Have i came through to the right person? You have, i am the customer services manager. My name is Ang…

实用指南:分布式架构未来趋势:从云原生到智能边缘的演进之路

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

人工智能之编程进阶 Python高级:第七章 数据库类模块

人工智能之编程进阶 Python高级:第七章 数据库类模块人工智能之编程进阶 Python高级 第七章 数据库类模块@目录人工智能之编程进阶 Python高级前言🗄️ 一、MySQL(关系型数据库)1. 安装(本地开发)Windows / mac…

linux for 跳出循环

在 Linux 中,如果你想“跳出循环”,通常是指在 for 循环中提前终止循环。这可以通过 break 或 exit 命令实现。下面是几种常见方式:1. 使用 break 跳出 for 循环 for i in {1..5}; doif [ $i -eq 3 ]; thenecho +…

用USB BLASTER II 下载sof文件没有问题,debug波形也没有问题。但是下载jic问题异常?

用USB BLASTER II 下载sof文件没有问题,debug波形也没有问题。但是下载jic问题异常? 1. 概述USB Blaster II是用于Intel(Altera) FPGA/CPLD高速编程设备。并且用于Intel FPGA有快的速度,最高24M运行工作。支持FPGA…

Linux用户管理相关知识

Linux用户管理 1.Linux操作系统开机流程 打开电源: 1.开机自检BIOS # BIOS(Basic Input/Output System) 检查cpu、内存、磁盘、硬件是否有问题。 2.MBR引导 # 主引导记录,通过硬盘启动 MBR--> /boot/swap…

AI浪潮下的机遇与挑战:从巨头动态看未来趋势

标签:AI技术、云服务、职业发展、行业观察最近刷新闻,发现AI领域又炸开了锅。从云服务故障到巨头战略升级,再到人才流动,整个行业像打了鸡血一样高速运转。作为一个对技术敏感的人,我忍不住把这些碎片信息拼凑起来…

CCF GESP 五级真题考频与知识点速查表

CCF GESP 五级真题考频与知识点速查表 (按 2023-2025 共 7 场正式考试出现次数降序,同频次按时间倒序)序号 题号 标题 出现次数 核心知识点(五级大纲) 难度标签1 B3871 因数分解 3 次 质因数分解 + 质数筛 普及−…

人工智能之编程进阶 Python高级:第五章 时间类模块

人工智能之编程进阶 Python高级:第五章 时间类模块人工智能之编程进阶 Python高级 第五章 时间类模块@目录人工智能之编程进阶 Python高级前言一、time 模块:底层时间操作(Unix 时间戳)常用函数时间格式化代码(st…

NSSCTF(WebFTP —— easyupload1.0) - 实践

NSSCTF(WebFTP —— easyupload1.0) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

推迟win11更新137年的方法

1、打开cmd2、粘贴命令并运行(注意引号是英文)reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" /v FlightSettingsMaxPauseDays /t reg_dword /d 5000 /f3、打开windows更新…

linux for 死循环

在 Linux 中, + #引号 + 死循环 + #引号 + (Dead Loop)通常指的是程序或脚本在执行过程中无限循环,无法正常退出。这可能是因为逻辑错误、未处理的异常、或未正确终止循环等原因导致的。 以下是一些常见的 Lin…

注册表禁用/启用Windows系统更新

在WindowsCenter中会通过注册表执行禁用windows更新的操作。 注册表位置\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate 禁用windows更新和关闭禁用windows更新的脚本如下。 禁用更新 reg ad…

CF954H

Sol 神秘观察题。 首先特判链一端在 LCA 的情况,这个是容易的。 首先不难想到一个暴力:\(f_{i,j}\) 表示链 LCA 在 \(i\),长度为 \(j\) 的个数,然后可以得到 \(f_{i,j}=\binom{a_i}{2}w_{1,i-1}\displaystyle\sum_…

PID 文件不一致导致 REDIS 一直重启

PID 文件不一致导致 REDIS 一直重启问题现象:Redis 服务每隔几十秒自动重启,systemd 状态显示为 activating,无法正常进入 active(running) 状态。排查过程: (1)日志显示没有找到/var/run/redis/redis-server.pi…

实用指南:centos7.2安装HAProxy1.5.18

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

爱玩机工具箱s22.1下载

爱玩机工具箱最新版下载