我鼓励你自己进行比较,看哪种方法适合你的情况。
例如,如果你要处理大量的XLSX文件,且每个文件只需要读取一次,那么你可能不需要考虑CSV转换。但是,如果你将反复阅读CSV,则强烈建议将工作簿中的每个工作表保存为csv文件,然后使用pd.read_csv()
重复读取它们。
下面是一个简单的脚本,可以让您比较直接导入XLSX
、在内存中转换XLSX为CSV
和导入CSV
。它基于Jing Xue的答案。
剧透:如果你将多次读取文件,将XLSX转换为CSV会更快。
我对一些正在处理的文件进行了测试,以下是我的结果:
5,874 KB xlsx file (29,415 rows, 58 columns)
Elapsed time for [Import XLSX with Pandas]: 0:00:31.75
Elapsed time for [Convert XLSX to CSV in mem]: 0:00:22.19
Elapsed time for [Import CSV file]: 0:00:00.21
********************
202,782 KB xlsx file (990,832 rows, 58 columns)
Elapsed time for [Import XLSX with Pandas]: 0:17:04.31
Elapsed time for [Convert XLSX to CSV in mem]: 0:12:11.74
Elapsed time for [Import CSV file]: 0:00:07.11
是的!相比于XLSX格式,这个202MB的文件只需要7秒就能处理完毕,而XLSX格式则需要17分钟!!!
如果你准备好自己进行测试,只需在Excel中打开XLSX文件并将任意一个工作表保存为CSV即可。对于最终解决方案,显然需要循环遍历每个工作表以进行处理。
你还需要执行pip install rich pandas xlsx2csv
命令来安装所需的库。
from rich import print
import pandas as pd
from datetime import datetime
from xlsx2csv import Xlsx2csv
from io import StringIO
def timer(name, startTime = None):
if startTime:
print(f"Timer: Elapsed time for [{name}]: {datetime.now() - startTime}")
else:
startTime = datetime.now()
print(f"Timer: Starting [{name}] at {startTime}")
return startTime
def read_excel(path: str, sheet_name: str) -> pd.DataFrame:
buffer = StringIO()
Xlsx2csv(path, outputencoding="utf-8", sheet_name=sheet_name).convert(buffer)
buffer.seek(0)
df = pd.read_csv(buffer)
return df
xlsxFileName = "MyBig.xlsx"
sheetName = "Sheet1"
csvFileName = "MyBig.csv"
startTime = timer(name="Import XLSX with Pandas")
df = pd.read_excel(xlsxFileName, sheet_name=sheetName)
timer("Import XLSX with Pandas", startTime)
startTime = timer(name="Convert XLSX to CSV first")
df = read_excel(path=xlsxFileName, sheet_name=sheetName)
timer("Convert XLSX to CSV first", startTime)
startTime = timer(name="Import CSV")
df = pd.read_csv(csvFileName)
timer("Import CSV", startTime)
ExcelFile.parse
。 - EdChum