大文件转为xlsx确实很慢,我自己什么不做,只是将csv拆开,然后转为xlsx,也很慢,240万数据,大概330s左右。 有4个日期字段,但是都做了预处理,感觉还是效果很小,用了engine=‘openpyxl’,仍然还是一样的速度
import pandas as pd # 读取 CSV 文件 chunksize = 500000 # 设置每个文件的行数 reader = pd.read_csv('your_file.csv', chunksize=chunksize) # 替换为你的 CSV 文件路径 # 分割数据并导出为多个 Excel 文件 file_number = 1 for chunk in reader: output_file = f"output_{file_number}.xlsx" # 设置导出文件名 chunk.to_excel(output_file, index=False) file_number += 1 print("数据已分割并导出为多个 Excel 文件")
1 l1xnan 2023-11-01 19:15:28 +08:00 没明白你那个“因为..., 然后 ...” 的因果关系。如果是读 csv 慢,用最新版本的 pandas 或者 pyarrow 或者 duckdb ,都非常快,不要自己写 open/for 循环,如果是写 xlsx 慢,格式决定写速度可优化空间不多,xlsxwriter 相比 openpyxl 性能好点,用 constant_memory=optimised 参数,内存优化非常明显,速度会比 openpyxl 库快一点 |
2 evemoo 2023-11-01 20:54:22 +08:00 一种思路 ```python def list_split(source_list, n): return [source_list[i:i+n] for i in range(0, len(source_list), n)] while line := f.readline(): do_something ``` |
![]() | 3 orangie 2023-11-01 22:07:20 +08:00 感觉像是没用 pandas ,而是自己解析和处理 csv 。对于 pandas 来说 3GB 的文件不大。 |
4 NoOneNoBody 2023-11-02 04:05:23 +08:00 你这个需要汇总么?不需要的话,读一行处理一行,添加到相应文件 如果只是拆分,不需要计算的话,按这种方式纯文字处理很快的 |
![]() | 5 SuperXX 2023-11-02 04:37:53 +08:00 via iPhone 拆分的闭着眼睛用 np.split 读写慢 用 parquet 或者 DuckDB , 其实这个数据量才 3GB…. 楼主得好好提升一下自己的语文, 虽然不知道你到底要表达啥,我还是盲猜吧 |
6 ho121 2023-11-02 07:10:08 +08:00 via Android 不如试试 Access |
![]() | 7 bianhui 2023-11-02 08:13:03 +08:00 没看明白啥意思,如果导出 xlsx excel 直接另存为不就行了吗。如果解析数据,read line ,不要 read lines 。 |
8 hyperbin 2023-11-02 08:18:34 +08:00 via Android excel 最多 1048576 行 |
![]() | 9 missuo 2023-11-02 08:34:46 +08:00 via iPhone 用 readline ,不要用 readlines ,不就行了 |
10 jiminjohn0402 OP @l1xnan 确实说的有问题,是因为两个原因要拆分 1 、文件太大,单独打开太慢 2 、即便打开了提示字段超长,可能现实不全,但是转为 xlsx 不会有这个问题 然后就开始想拆分方案,我自己参考网上的方案写了一份,感觉有点慢: import pandas as pd # 读取 CSV 文件 data = pd.read_csv('customer.csv') # 按照“客户编号”列排序 # 转换为字符串列排序 data['客户编号'] = data['客户编号'].astype('str') sorted_data = data.sort_values(by='客户编号', ascending=False) # 将数据拆分为 30 个数据桢并保存为 CSV 文件 num_files = 30 chunk_size = len(sorted_data) // num_files for i in range(num_files): start_idx = i * chunk_size if i < num_files - 1: end_idx = (i + 1) * chunk_size else: end_idx = len(sorted_data) chunk = sorted_data.iloc[start_idx:end_idx] chunk.to_excel(f'chunk_{i + 1}.xlsx', index=False) |
![]() | 11 laqow 2023-11-02 09:03:37 +08:00 直接 bash 下用 head -l 拆不就行了?拆完每个文件加上第一个文件的第一行,然后用 python 或什么别的多进程转成 excel 。 超过 10M 的文件都不要用 excel ,不然每次打开都要等半天,excel 还有各种自动转码的 feature ,长数字转 int 超长截断,反斜杠变日期之类的。reCSVEditor 之类的直接看 csv 要简单很多。 |
![]() | 12 Maerd 2023-11-02 09:18:51 +08:00 xlsx 自带压缩,基础数据类型也和 csv 不同,你在转出时首先要将数据格式转成 xlsx 的格式,然后再进行压缩,你想想这能快吗 |
![]() | 13 jiyan5 2023-11-02 11:29:07 +08:00 吐槽下 excel 的后缀名是啥玩意,不如 doc ppt 的好记 |
14 volvo007 2023-11-02 11:36:41 +08:00 @jiminjohn0402 有点慢是多慢?一般最新的 pandas 打开 3G 的 csv 应该和玩一样。如果慢,可能和你的数据类型有关,比如如果日期类比较多的话,pd 会用不同的日期格式去匹配,这个过程也是非常慢的。嫌慢也可以考虑基于 pyarrow 的 polars 去处理。arrow 是 Apache 的顶级框架之一,专门用来处理大数据的。此外,pd 是基于 numpy 的,而 numpy 本身不包含 string 类型,因为这不是 numpy 最关心的问题,它都是“数据”计算。所以如果文本类型比较多得话,还是考虑 pyarrow 这种原生支持 string 的库去处理才是合适的 |
![]() | 15 djangovcps 2023-11-02 12:02:35 +08:00 众所周知 python 的各种库 写 excel 都是慢的,根本就没说到点子上,真的嫌慢,用 python3.11 有伪 jit 加速,写 xlsx 会快 80%,我试过的 |
16 jiminjohn0402 OP @volvo007 大概花了两个小时分拆出 30 个文件,每个文件 80 多万条数据 |
17 NoOneNoBody 2023-11-02 13:14:42 +08:00 @jiminjohn0402 #10 首先看你写的,并不需要 pandas ,逐条读取,提取客户编号作为判断,然后写到 xlsx ,加几个计数器的事,当然这样没有排序,但可以不同客户编号用不同输出 或者倒入 sqlite ,后面就不用说了 然后说这段代码 1.sort_values 应该加上 ignore_index=True ,重排 index 2.你这个完全可以用 groupby ,不用 sort ,2000w 条为了分编号 sort 没必要 3.有个 more_itertools.chunked ,不用自己算切片 4.也可以用 while + dataframe.head ,每次 drop 已完成的部分 看整个流程关键点是排序,而且你这个也仅仅是客户编号排序而已,如果这不是必须的,选择方式就很多了 |
18 volvo007 2023-11-02 16:15:03 +08:00 @jiminjohn0402 这个速度非常不正常,可能的话再多给一些数据结构的信息吧,或者直接上代码,做个列名的脱敏处理。30 个文件,每个才 100 M ,这种估计 2-5 分钟完成比较正常 |