如何在Python中批量将CSV文件转化为Parquet格式以提升读取?

星婷小哥_2838

星婷小哥_2838

2026-07-21

373人浏览

原创

直接用pandas.read_csv读多个csv再写parquet会内存爆炸、速度慢、类型推断错误,因pandas全量加载且跨文件dtype不一致;正确做法是用pyarrow.csv.read_csv逐个流式读取,显式指定schema、use_threads、block_size及strings_to_nulls,并统一cast baseline_schema后写入parquet。

如何在python中批量将csv文件转化为parquet格式以提升读取?

为什么直接用 pandas.read_csv() 读多个CSV再写Parquet会出问题

内存爆掉、速度慢、类型推断错——这是最常踩的坑。pandas 默认把所有 CSV 全读进内存再统一转,哪怕单个文件只有 10MB,100 个就是 1GB+;更麻烦的是,不同 CSV 的同名列可能被 pandas 推断成不同 dtype(比如有的列全空被当 float64,有的含字符串被当 object),导致后续合并或写 Parquet 失败,报错类似 ArrowInvalid: Cannot merge types string and double。

正确做法是逐个处理、显式指定 schema、流式写入:

  • 用 pyarrow 直接读 CSV(跳过 pandas 中间层),控制 chunk 大小和列类型
  • 每个文件单独转成 Parquet,不拼接、不合并
  • 写入时强制统一 schema(尤其 null 值多的列,显式设为 string 或 nullable int)

用 pyarrow.csv.read_csv() 替代 pandas.read_csv()

它更快、内存可控、支持类型预声明。关键不是“能不能读”,而是“怎么读才不会崩”:

  • read_options 里设 use_threads=True 和 block_size=1024*1024(1MB chunk)能显著提速
  • convert_options 必须配 strings_to_nulls=True,否则空字符串变 "" 而非 NULL,Parquet 里类型对不上
  • 列类型不能靠猜:用 column_types={"user_id": pa.int64(), "name": pa.string()} 显式声明,避免后期 type conflict

示例片段:

testing-python
testing-python

使用pytest编写和评估有效的Python测试。适用于编写测试、审查测试代码、调试测试失败或提高测试覆盖率。

下载
import pyarrow as pa
import pyarrow.csv as pc
import pyarrow.parquet as pq
<p>table = pc.read_csv(
"data.csv",
read_options=pc.ReadOptions(use_threads=True, block_size=1024*1024),
convert_options=pc.ConvertOptions(
strings_to_nulls=True,
column_types={"id": pa.int64(), "desc": pa.string()}
)
)
pq.write_table(table, "data.parquet", compression="snappy")</p>

批量处理时如何保证 schema 一致?

多个 CSV 结构稍有差异(比如新增列、列顺序不同、空值表示不同),直接并行转 Parquet 会导致下游查询失败。必须先“对齐 schema”:

  • 抽一个代表性 CSV 文件,用 pyarrow.csv.read_csv(..., max_rows=1000) 读少量行,生成基准 schema
  • 后续每个文件都用这个 schema 强制转换:table.cast(baseline_schema, safe=False)(safe=False 允许隐式类型转换,比如 string → int,但需确认业务可接受)
  • 遇到缺失列,用 pa.array([None] * len(table), type=baseline_schema.field("new_col").type) 补空列

别依赖 infer_schema=True —— 它在不同文件上结果不稳定,是后续 Parquet 合并报错的根源。

写 Parquet 时哪些参数影响读取性能?

转完格式只是开始,读得快才是目的。这几个参数不调,Parquet 就白转了:

  • compression="snappy" 是默认且推荐的:压缩率适中、解压极快,比 gzip 读取快 2–3 倍
  • use_dictionary=True(默认开启)对低基数字符串列很关键,能大幅减少体积和 I/O
  • row_group_size=500000(而非默认的 1M)更适合 OLAP 查询:太大会增加内存压力,太小则元数据膨胀
  • 绝对不要用 write_table(table, ..., use_legacy_dataset=False) 的旧路径——新 dataset API 才支持 predicate pushdown 和 column pruning

最后提醒一句:如果原始 CSV 本身带 BOM 或编码混乱(比如 GBK 混 UTF-8),pyarrow.csv.read_csv() 会静默失败或乱码,务必提前用 chardet 检查并显式传 encoding 参数。这步漏掉,后面所有优化都白搭。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4204

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24417

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2987

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3007

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程