超大csv文件转xlsx文件¶
任务:把一个shape=(10000, 44)
的csv文件转换成xlsx格式
!ls ./tmp -al
total 4104
drwx------+ 1 yangz yangz 0 Mar 2 18:09 .
drwx------+ 1 yangz yangz 0 Mar 2 18:11 ..
drwx------+ 1 yangz yangz 0 Mar 2 17:39 .ipynb_checkpoints
-rwx------+ 1 yangz yangz 4185300 Mar 2 16:35 tmp.csv
pandas¶
在python中提到处理表格数据,最通用的工具就是pandas了。我们可以用pd.read_csv
把数据读取成pd.DataFrame
然后再保存为.xlsx
文件。
import pandas as pd
值得注意的是,在保存为xlsx
文件的时候,可以选择不同的ExcelWriter
引擎。
不同的引擎对比¶
%%timeit
df = pd.read_csv('./tmp/tmp.csv', dtype=str, encoding='utf-8')
with pd.ExcelWriter("./tmp/xlsxwriter.xlsx", engine="xlsxwriter") as writer:
df.to_excel(writer)
6.36 s ± 338 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
df = pd.read_csv('./tmp/tmp.csv', dtype=str, encoding='utf-8')
with pd.ExcelWriter("./tmp/openpyxl.xlsx", engine="openpyxl") as writer:
df.to_excel(writer)
10.2 s ± 162 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
如果需要批量处理多个文件,还可以直接写入到压缩包内,省去最后压缩的时间。
直接写入到压缩包¶
import zipfile
%%timeit
df = pd.read_csv('./tmp/tmp.csv', dtype=str, encoding='utf-8')
with zipfile.ZipFile("./tmp/tmp.zip", "w") as zf:
with zf.open("zipfile.xlsx", "w") as buffer:
with pd.ExcelWriter(buffer, engine="xlsxwriter") as writer:
df.to_excel(writer)
6.42 s ± 148 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
而在Windows平台,还有一个强有力的工具:pywin32
pywin32¶
我们可以通过pywin32
直接使用Windows上的程序。在这里我们就要用Excel
给的接口来完成任务。
Windows默认的文件编码格式是gbk,需要转换一下
with open('./tmp/gbk.csv', 'w+', encoding='gbk') as f:
with open('./tmp/tmp.csv', 'r', encoding='utf8') as raw:
f.write(raw.read())
import win32com.client as wc
%%time
excel = wc.gencache.EnsureDispatch("Excel.Application")
csv = excel.Workbooks.Open('c:/users/yangz/Desktop/tmp/gbk.csv')
csv.SaveAs(Filename='tmp.xlsx', FileFormat=51)
excel.Quit()
CPU times: total: 46.9 ms
Wall time: 3.65 s
这速度,可以说在写xlsx
格式方面,各种开源库被Excel薄纱。
csv2xlsx¶
import os
%%timeit
os.system("csv2xlsx.exe -o ./tmp/csv2xlsx.xlsx ./tmp/tmp.csv ")
2.39 s ± 90.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
这是一个哥们用go语言写的,也不错。但是经过我的亲测,如果是更大的文件(百万行),还是不如Excel好用。
一些参考资料¶
Last update: 2024-04-25 20:21:35
Created: 2023-03-02 18:34:08
Created: 2023-03-02 18:34:08