pandas和excel、csv高效读写的增强库

您所在的位置:网站首页 pandas数据写入csv pandas和excel、csv高效读写的增强库

pandas和excel、csv高效读写的增强库

2023-04-13 01:38| 来源: 网络整理| 查看: 265

pandas的I/O相对各类包一直偏慢且存在易用性问题,特别是对于大文件的读写,瓶颈非常明显。pandasrw 库通过将各类库进一步封装,提高了pandas 读写excel、csv等文件的性能和易用性。

这个库是本人发布在github的一个项目,欢迎大家交流,方便的时候的给个star。pandasrw的名称是pandas read和write的缩写,目前支持excel、csv和pickle文件的读写。

https://github.com/stormtozero/pandasrw

目前该库已经上传pypi可以通过pip进行安装

pip install pandasrw

在python中导入包

from pandasrw import load,dump一、功能特点

从性能提升、易用性提升和流式加载方面对pandas的表格数据读写进行了增强。其中在性能提升方面可以提升2-3倍的性能,在易用性方面封装了编码转换和文件类型自动识别。此外还实现了三个小功能,一个简单的流式加载和计算的功能、csv的编码转换功能和xlsx转换为csv的功能。

1、性能提升

通过封装polars、pandas、xlwings库实现性能的提升和保证兼容性。通过参数engine来选择采用的读写引擎,默认采用polars库。对于polars和xlwings不支持的格式后端自动选择pandas进行兼容。

各类引擎的特点如下:

polars库: 是pandasrw的默认引擎。这是一个rust写的高性能库,截至2023年3月该库的star已经超过1.3k,性能和质量已经经过检验。polars是目前pandas的主要竞品库,并且有较大的优势,但是随着pandas 2.0的发布预计优势会缩小甚至消失。

pandas加速利器—polars - 知乎 (zhihu.com)

读写快,xlsx可以比pandas快2倍,csv可以快3倍。

兼容性较好,但是不如pandas。 支持xlsx和csv文件类型,但是不支持xls功能。其中xlsx为通过xlsx2csv库转换为csv来实现。

建议:推荐使用。

pandas库: 读写较慢,但是兼容性最好支持xlsx、xls、csv、pkl四种文件类型。

建议:备选。

xlwings库: 对大文件的读写速度最快。支持xlsx和xls两种文件类型,该库本身支持csv,但是在测试时性能较差未采用。 读写xlsx文件速度最快,可以达到pandas的3倍,但是在数据类型推断上较为粗糙,数据类型只能区分为object和float64两种类型,不能进一步区分int64等类型。本库通过调用 win32实现对excel的操作,需要使用windows操作协同且安装了excel软件。

建议:谨慎使用。在excel数据较大一般超过100M时使用,且对细分数据类型不敏感或者采用手动修改数据类型的场景。

2、易用性提升

易用性方面主要做了以下二个方面的提升 2.1、对csv格式的编码自动修改为utf-8解决了 “‘utf-8’ codec can’t decode”等编码类报错。 2.2、对各类后缀进行了自适应,无需在手动指定excel、csv、pickle等

3、大内存表的流式加载和计算

为了API的简洁暂时只实现了一个sheet的表格的流式加载和计算,会输出一个迭代器对象

对于该迭代器对象,通过遍历迭代器分块运算,具体见API部分。

二、常用API1、加载表df=load(file_path, col_name=None,sheetname='Sheet1',engine="polars")

示例:输入路径读取Sheet1表的全部列,生产pandas的DataFrame 默认使用polars引擎。该表可以是xlsx、xlsx、csv和pkl格式

df=load(file_path)2、写入表dump(df,file_path,sheetname='Sheet1',engine="polars")

示例:输入路径,将pandas的DataFrame写入Sheet1表,默认使用polars引擎。该表可以是xlsx、xlsx、csv和pkl格式

dump(df,file_path)3、流式加载表

file_path是路径, row_count是没错读取的行

load_stream_row(file_path, row_count,col_name=None)

生成一个pandas.io.parsers.readers.TextFileReader对象

对于该迭代器对象,通过遍历迭代器分块运算

3.1、遍历迭代器

3.2、对于迭代器中的每个DataFrame进行运算

3.3、采用追加写(功能mode="a"或者mode=“a+”)的方式写入csv。

注意:file_result_csv和上文函数中的file_path_csv绝对不能相同,即读取的csv和存入的csv不能同路径。否则会不停的迭代下去,不能退出循环。

原因:使用chunksize分块读取后,pandas并没有真正的将csv的内容加载入内存,只是解析了csv的内容和建立了连接(类似浅拷贝),在调用迭代器时再从csv中加载。所以再使用追加写的时候,会一边写入csv,一边再从csv中读取,形成死循环。

for df in df_iter: df=运算结果 df.to_csv(file_result_csv,mode="a", index=False,encoding='UTF-8',header=False)

示例3:输入路径读取Sheet1表的全部列,生产pandas的DataFrame 默认使用polars引擎。该表可以是xlsx、xlsx、csv和pkl格式

df_iter=load_stream_row(file_path, row_count)4、将csv转化为utf8编码encode_to_utf8(filename, des_encode)5、将xlsx转换为csv

会在file_path文件夹下生成一个同名csv文件。

xlsxtocsv(file_path)三、pickle支持和使用

如果一个较大的表会多次使用,请转pickle存储,后续读写pickle文件会大大加快读写性能。

四、其他研究

目前对openpyxl库进行了研究。这个库是pandas解析xlsx格式文件的底层库。该库的read_only模式是pandas应用的模式。舍弃灵活性和兼容性后比pandas可以提速15%左右,感觉得不偿失。

1、使用read_only=True模式,该模式读取快,但是不能进行多进程加速。因为该模式本质是懒加载的,先生成一个迭代器再逐步从磁盘读取。读取磁盘的过程会导致多进程阻塞,无法并行,会顺序执行。实验了先读取文件再多进程分析生成器的方式、在每个进程中分别加载xlsx文件和将文件复制多个副本,每个进程读取副本三种方式,均无法加速。

with open(xlsx_filename, "rb") as f: in_mem_file = io.BytesIO(f.read())

2、不使用read_only模式,该方式由于是一次加载入内存,使用实验了先读取文件再多进程解析是可以多进程的,但是该模式加载时间过长,不如read_only单线程。

五、版本更新

v 0.0.1第一个版本

v 0.0.2 修改了polar引擎,在read_csv_options中增加了{"infer_schema_length":1000,"ignore_errors":False})两个配置,性能进一步提升,特殊情况下兼容性降低,可以采用pandas引擎弥补(之前需要对文件读两次完成类型推断,一次类型推断,一次读文件。当前只对前1000行读进行内容推断)。

发生以下报错切换engine="pandas"

You might want to try: - increasing `infer_schema_length` (e.g. `infer_schema_length=10000`), - specifying correct dtype with the `dtypes` argument - setting `ignore_errors` to `True`, - adding `xx` to the `null_values` list

v 0.03

更新openpyxl引擎写的load_excel函数,比pandas引擎快20%,兼容性基本一致。该函数可以支持部分行读取。

polars引擎增加了read_csv_options选项,目前默认关闭。打开后使用者可以自己设置各类参数,主要是{"infer_schema_length":1000,"ignore_errors":False} 该参数影响类型推断的精度和速度。

polars引擎读取excel表后默认删除全部值为空的行和列。

load_excel(file_path,sheetname='Sheet1',start_row=2,end_row=None)

v 0.04 待实现

polars引擎读取csv表后默认删除全部值为空的行和列。

另外将增加追加写功能

polars不能写入重名列

对xlwings 引擎再读为pandas后自动增加infer_schema=True自动推断选项,实现类型自动推断。

df=df.convert_dtypes()

对excel追加写的API分为pandas和xlwings两种引擎。其中xlwings引擎计划支持 开始写入单元格 与已有数据间隔xx行,写入哪个sheet,是手动关闭还是自动关闭(手动关闭时打开excel后一致不关闭,可以更快的写入,避免重复打开excel)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3