pandas和excel、csv高效读写的增强库 |
您所在的位置:网站首页 › pandas数据写入csv › pandas和excel、csv高效读写的增强库 |
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.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` listv 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 |