Skip to content

超大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

Comments