超大csv文件转xlsx文件
任务:把一个shape=(10000, 44)
的csv文件转换成xlsx格式
| 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
文件。
值得注意的是,在保存为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)
|
如果需要批量处理多个文件,还可以直接写入到压缩包内,省去最后压缩的时间。
直接写入到压缩包
| %%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
| %%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好用。
一些参考资料