news 2026/9/18 20:59:19

Pandas Input/Output 完全指南:从 Pickle 到 Iceberg 的官方 I/O API 全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pandas Input/Output 完全指南:从 Pickle 到 Iceberg 的官方 I/O API 全解析

Pandas Input/Output 完全指南:从 Pickle 到 Iceberg 的官方 I/O API 全解析

【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas

导读

本文基于 pandas 官方 API 参考文档doc/source/reference/io.rst编写,系统梳理 pandas 数据读写(I/O)的完整 API 面:从最基础的 Pickle、CSV 文本文件,到 Excel、JSON、HTML、XML、LaTeX 等结构化格式,再到 HDF5、Feather、Parquet、Iceberg、ORC 等列式二进制格式,以及 SAS、SPSS、SQL、STATA 等统计与数据库生态。读者将掌握每种格式的入口函数、核心参数、适用场景与底层实现机制,并能在实际项目中按需选择合适的存储与交换方案。

总览:pandas 的 I/O API 版图

pandas 将绝大部分数据读写能力统一收敛到pandas.io包下。以 pandas/io/api.py 中__all__列表为准,顶层可用的读取函数共有:

read_clipboardread_csvread_excelread_featherread_fwfread_hdfread_htmlread_icebergread_jsonread_orcread_parquetread_pickleread_sasread_spssread_sqlread_sql_queryread_sql_tableread_stataread_tableread_xml,以及写入函数to_pickle和类ExcelFileExcelWriterHDFStore

官方参考文档 doc/source/reference/io.rst 将这些 API 按格式分为 13 个大类,本文逐一展开,并在每节结合仓库源码给出实现层面的补充说明。

Pickling:Python 原生序列化

关联 APIread_pickleDataFrame.to_pickle

import pandas as pd original_df = pd.DataFrame({"foo": range(5), "bar": range(5, 10)}) pd.to_pickle(original_df, "./dummy.pkl") # 写入 unpickled_df = pd.read_pickle("./dummy.pkl") # 读回

底层实现位于 pandas/io/pickle.py:

  • to_pickle(obj, filepath_or_buffer, compression="infer", protocol=pickle.HIGHEST_PROTOCOL, storage_options=None)通过get_handle打开文件句柄后直接pickle.dump。源码注释明确说明"letting pickle write directly to the buffer is more memory-efficient",即直接写入缓冲区比中间构造额外对象更省内存。
  • protocol支持负值,传入负数时等价于pickle.HIGHEST_PROTOCOL
  • compression="infer"时,会根据扩展名自动推断压缩格式,支持.gz.bz2.zip.xz.zst.tar及组合(如.tar.gz)。也可传入字典精细控制,例如compression={"method": "gzip", "compresslevel": 1, "mtime": 1}可生成可复现的 gzip 归档。
  • read_pickle还支持从 S3、GCS 等远程 URL 读取(需要s3fs等可选依赖),并通过storage_options传递连接参数。

注意两点

  1. 安全性:文档明确警告"Loading pickled data received from untrusted sources can be unsafe"。pickle 本质是任意代码执行载体,只应读取可信来源的数据。
  2. 兼容性read_pickle只保证与当前或上一大版本创建的 pickle 向后兼容。例如 pandas 3.x 最早可读取 2.0.0 生成的 pickle(见 pandas/io/pickle.py 的 Notes 说明)。

Flat file:CSV 与定宽文本

关联 APIread_tableread_csvDataFrame.to_csvread_fwf,以及底层迭代器TextFileReader(含readget_chunkclose方法)。

read_csvread_table都定义在 pandas/io/parsers/readers.py 中,前者是 CSV(逗号分隔)的专用入口,后者默认以sep="\t"读取制表符分隔的表格文件,二者共享同一套_read_shared关键字参数。核心参数分组如下:

分组参数说明
列与索引header="infer"自动推断表头行;也支持header=None或传入行号序列实现多级表头
names自定义列名列表
index_col=None指定用作行索引的列(支持多列形成 MultiIndex)
usecols=None只读取部分列,可传列名列表或可调用函数
通用解析dtype=None强制指定列类型,如{"id": "int32", "score": "float64"}
engine=None"c"(C 解析器,默认)或"python"(纯 Python,功能更全但更慢)
converters逐列应用转换函数
skiprowsskipfooternrows跳过头尾行、仅读前 N 行
缺失值na_values=None自定义哪些值被视为 NaN;keep_default_na=True表示在自定义基础上保留默认 NA 集合
na_filter=Trueskip_blank_lines=True是否启用缺失值过滤、是否跳过空行
日期处理parse_datesdate_format自动解析日期列,或按指定格式解析

分块读取:当iterator=True或指定chunksize时,read_csv返回TextFileReader(来自pandas.io.parsers模块)而非DataFrame。随后可用get_chunk(n)逐块获取数据,处理完调用close()释放资源,非常适合超大文件的流式处理。

read_fwf用于读取固定宽度(Fixed-Width Format)文件,例如来自旧式主机系统的导出数据,此时需通过colspecswidths显式声明每列的起止位置。

Clipboard:系统剪贴板

关联 APIread_clipboardDataFrame.to_clipboard

df.to_clipboard(sep=",") # 将 DataFrame 以 CSV 文本复制到剪贴板 new_df = pd.read_clipboard() # 从剪贴板文本读回 DataFrame

实现位于 pandas/io/clipboards.py,底层复用了to_csv/read_csv的解析链路(默认以制表符分隔),在需要与 Excel、电子表格软件快速交换数据时非常实用。

Excel

关联 APIread_excelDataFrame.to_excelExcelFile(含booksheet_namesparse)、ExcelWriterStyler.to_excel

df = pd.read_excel("data.xlsx", sheet_name="Sheet1", index_col=0) # 读取指定工作表 df.to_excel("out.xlsx", sheet_name="结果", index=False) # 写入,去掉索引列 with pd.ExcelWriter("multi.xlsx") as writer: # 一个文件写多个工作表 df1.to_excel(writer, sheet_name="a") df2.to_excel(writer, sheet_name="b")
  • ExcelFile(定义于 pandas/io/excel/_base.py)用于惰性打开工作簿,sheet_names列出全部工作表名,parse(sheet_name, ...)解析指定表;book暴露底层引擎对象(如openpyxlWorkbook)。
  • read_excel支持sheet_name传字符串、整数(从 0 开始的下标)、列表或None(读取全部工作表,返回dict[str, DataFrame])。
  • 引擎自动按扩展名选择:.xlsxopenpyxl.xlsxlrd.odsodf,也可通过engine参数强制指定。
  • Styler.to_excel可将带样式(单元格格式、条件格式、列宽等)的 Styler 对象写出,实现"所见即所得"的报表导出。

JSON

关联 APIread_jsonjson_normalizeDataFrame.to_jsonbuild_table_schemaJsonReader

read_json定义于 pandas/io/json/_json.py,支持多种orient布局,是理解该 API 的关键:

orient布局结构适用typ
"split"{index: [...], columns: [...], data: [...]}frame / series
"records"[{column: value}, ...](每行一个对象)frame / series
"index"{index: {column: value}}frame / series
"columns"{column: {index: value}}frame
"values"纯值数组frame
"table"{schema: {...}, data: {...}},携带完整表结构 schemaframe

默认规则:typ="frame"时默认orient="columns"typ="series"时默认orient="index",且 series 只允许splitrecordsindex三种。注意indexcolumns两种 orient 要求索引唯一,records要求列名唯一。

其他常用参数:

  • lines=True:按行读取 JSON Lines(每行一个 JSON 对象),配合chunksize可返回JsonReader迭代器实现流式解析;
  • dtype:True(推断)或列名到类型的字典;传入False可完全关闭类型推断;
  • convert_dateskeep_default_dates:日期列自动转换。默认"datelike"列名特征为以_at_time结尾,或以timestamp开头,或名为modifieddate(两个参数在 3.1.0 起已弃用,官方建议改用dtype=False或读后pd.to_datetime);
  • date_unit:强制指定时间戳单位s/ms/us/ns
  • precise_float=True:使用更高精度的strtod解析浮点数;
  • engine:默认"ujson"(高速 C 实现),可切换"pyarrow"等引擎。

json_normalize用于把嵌套 JSON(如列表嵌套字典)扁平化为记录表;build_table_schema(来自pandas.io.json)生成符合 Table Schema 规范的 JSON 结构,与orient="table"互通。

HTML

关联 APIread_htmlDataFrame.to_htmlStyler.to_html

read_html(pandas/io/html.py)利用lxml/bs4+html5lib等解析器从 HTML 页面中提取<table>表格并返回DataFrame列表(一个页面往往含多张表,通过match参数用正则筛选目标表)。to_html将 DataFrame 渲染为 HTML 表格字符串或文件,Styler.to_html则输出带 CSS 样式的完整可发布报表。

XML

关联 APIread_xmlDataFrame.to_xml

df = pd.read_xml("data.xml", xpath=".//record") # 用 XPath 定位要解析的节点 df.to_xml("out.xml", root_name="data", row_name="record")

read_xml(pandas/io/xml.py)基于lxml(或etree),用 XPath 表达式从 XML 文档提取数据;to_xml反向将 DataFrame 序列化为 XML,支持自定义根节点名root_name与行节点名row_name

LaTeX

关联 APIDataFrame.to_latexStyler.to_latex

print(df.to_latex(index=False)) # 生成可直接插入 .tex 文档的表格代码

to_latex输出 LaTeXtabular/longtable环境代码;Styler.to_latex还能把样式(如高亮、加粗)一并转换为 LaTeX 命令,适合学术论文表格自动化生成。

HDFStore:PyTables(HDF5)

关联 APIread_hdfHDFStore全家族方法:putappendappend_to_multiplegetselectselect_as_coordinatesselect_as_multipleselect_columnremovecreate_table_indexcopyflushinfois_openkeysgroupsget_storerwalk

HDFStore(pandas/io/pytables.py)提供类字典风格的 HDF5 文件接口:

with pd.HDFStore("store.h5") as store: store.put("df1", df1, format="table") # 写入(键-对象存储) store.append("df1", df_more) # 追加行 df2 = store["df1"] # 读取 store.remove("df1") # 删除

format="table"(对应append/select)支持条件查询、追加与索引(create_table_index);format="fixed"(对应put)写入更快但不可追加。HDFStore的方法如select_as_coordinates返回行坐标、select_column只取单列、walk遍历键层级、info输出文件结构摘要,适合管理大规模分块存储的时序数据。

文档警告:可以将DataFrameSeries子类存入 HDF5,但子类类型会在存储时丢失(读回得到的是基类),序列化前请确认不依赖子类特有行为。

Feather

关联 APIread_featherDataFrame.to_feather

Feather 是 Apache Arrow 生态下的轻量列式二进制格式(pandas/io/feather_format.py),写入极快且与 R 的feather包互通。适合进程间快速交换与语言间共享数据,但不保留索引(索引会被当作普通列处理)。

Parquet

关联 APIread_parquetDataFrame.to_parquet

df.to_parquet("data.parquet", compression="zstd") # 写入,压缩 df2 = pd.read_parquet("data.parquet") # 读回

Parquet(pandas/io/parquet.py)是 Hadoop/Spark 生态标准的列式存储,支持嵌套结构、谓词下推与高压缩比,是大数据分析的首选格式。engine可选"pyarrow"(推荐,功能最全)或"fastparquet"compression支持snappygzipzstd等。它能完整保留索引与数据类型,相比 Feather 更适合长期归档。

Iceberg(实验性)

关联 APIread_icebergDataFrame.to_iceberg

df.to_iceberg("catalog.db.table", catalog=my_catalog) # 写入 Iceberg 表 df2 = pd.read_iceberg("catalog.db.table", catalog=my_catalog)

Iceberg 是面向数据湖的高性能表格式,支持 ACID 事务、快照与时间旅行。实现位于 pandas/io/iceberg.py。注意文档警告:read_iceberg目前为实验性功能(experimental),API 可能在后续版本无预警地变化,生产环境使用需谨慎评估。

ORC

关联 APIread_orcDataFrame.to_orc

ORC(Optimized Row Columnar,pandas/io/orc.py)是 Hive 生态的列式格式,压缩效率高,与 Hive/Spark 集成密切。pandas 中读写 ORC 依赖pyarrow

SAS

关联 APIread_sas

read_sas(pandas/io/sas/sasreader.py)读取 SAS 的.sas7bdat数据库文件与.xpt传输格式,是读取统计分析软件 SAS 数据的标准入口(只读,无写入 API)。

SPSS

关联 APIread_spss

read_spss(pandas/io/spss.py)读取 SPSS 的.sav文件,支持转换变量标签与值标签。仓库中内置了.sav测试样本(见pandas/tests/io目录),可验证读取行为。

SQL

关联 APIread_sql_tableread_sql_queryread_sqlDataFrame.to_sql

import sqlalchemy engine = sqlalchemy.create_engine("sqlite:///mydb.sqlite") df.to_sql("mytable", engine, if_exists="replace") # 整表写入 df2 = pd.read_sql_table("mytable", engine) # 整表读取 df3 = pd.read_sql_query("SELECT * FROM mytable WHERE x > 10", engine) df4 = pd.read_sql("mytable", engine) # 智能分发:表名走 read_sql_table,SQL 走 read_sql_query

三者均定义于 pandas/io/sql.py:

  • read_sql_table:整表读取,支持columnsindex_colparse_dateschunksize分块迭代;
  • read_sql_query:执行任意 SQL 查询并返回 DataFrame;
  • read_sql:根据第一个参数是表名还是 SQL 字符串自动分发到上述两者;
  • to_sql:支持if_existsfail/replace/append)、indexdtype(指定 SQL 列类型)等参数,可通过method="multi"批量插入提升效率。

STATA

关联 APIread_stataDataFrame.to_stata,以及StataReader.data_labelStataReader.value_labelsStataReader.variable_labelsStataWriter.write_file

read_stata(pandas/io/stata.py)读取.dta文件,关键参数:

  • convert_dates=True:Stata 内部日期整数自动转 pandas 时间戳;
  • convert_categoricals=True:将带值标签的变量还原为category类型;
  • convert_missing=False:是否保留 Stata 的扩展缺失值(.a~.z);
  • preserve_dtypes=Trueorder_categoricals=True:保持原始数据类型与类别顺序;
  • index_colcolumns:选择索引列与子集列;
  • chunksize/iterator:分块读取返回StataReader

StataReader还暴露data_label(数据集标签)、variable_labels(变量标签字典)、value_labels(值标签字典)等元数据访问属性;StataWriter.write_file完成写出。pandas 同样提供to_stata以 DataFrame 写出.dta,方便 R 等 Stata 用户回读。

写入端的统一视角:to_*系列

文档中所有格式几乎都成对提供读/写入口。除了上述to_pickleto_csvto_excelto_jsonto_htmlto_xmlto_latexto_hdf(pandas/io/pytables.py)、to_featherto_parquetto_orcto_icebergto_sqlto_statato_clipboard之外,仓库中 pandas/io/api.py 显示to_pickle是顶层独立导出的通用序列化函数,而 DataFrame 方法DataFrame.to_*与模块级pd.to_*通常共享同一底层实现。

选型建议(依据各格式在仓库中的实现定位与文档说明):

  • 临时缓存 / 对象保真:Pickle(任意 Python 对象、速度快,但不可跨语言且需注意安全与版本兼容);
  • 文本交换 / 通用性:CSV(read_csv,生态最广,但无类型信息);
  • 跨语言列式存储:Parquet(大数据生态标准,压缩与谓词下推好)、Feather(轻量快速、与 Arrow/R 互通)、ORC(Hive 生态);
  • 数据湖表格式:Iceberg(实验性,支持 ACID 与快照);
  • 统计软件互操作:STATA(.dta)、SAS(.sas7bdat)、SPSS(.sav);
  • 数据库持久化:SQL(to_sql+read_sql,配合 SQLAlchemy);
  • 报表发布:Excel(多工作表 + 样式)、HTML、LaTeX。

进一步阅读

  • 用户指南doc/source/user_guide/io.rst提供各格式的详细教程与完整参数示例;
  • API 参考的完整索引见 doc/source/reference/index.rst;
  • 各格式均有配套测试样本与用例,例如pandas/tests/io下的csvexcelparquetjsonstata等子目录,可作为理解边界行为的第一手资料。

【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 20:57:29

嵌入式工程可靠性实战:看门狗、保护机制、降级与故障注入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 20:54:07

ARM芯片与开发板机械控制:GPIO、PWM与SPI DMA实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 20:51:15

政府燃气安全监管平台是什么?5 大核心功能与应用价值详解

燃气安全监管平台正在从单一的信息化工具演变为城市治理体系的关键基础设施。长期以来&#xff0c;燃气安全监管面临数据分散、协同不畅、责任难压实等结构性难题&#xff0c;仅靠传统行政手段已难以应对日益复杂的城市燃气风险。随着物联感知、地理信息与人工智能技术的深度融…

作者头像 李华
网站建设 2026/9/18 20:51:09

Spring Boot驾校练车预约系统:从数据库建模到并发控制实战

做一个驾校练车预约系统&#xff0c;是我带过最典型的计算机毕业设计题目之一。项目本身不大不小&#xff0c;复杂度刚好卡在“工作量足够展示技术栈”和“难度不至于做不出来”之间&#xff0c;非常适合作为Spring Boot入门后的完整实践项目。我最近刚好把一个完整的springboo…

作者头像 李华