在Python中读取非常大的Excel文件(使用pandas),大约有500,000行。
在Python中读取非常大的Excel文件(使用pandas),大约有500,000行。
我有一个14MB大小的Excel文件,包含五个工作表,我正在将其读入Pandas数据框中。尽管下面的代码可以运行,但需要9分钟的时间!有人有加快速度的建议吗?
import pandas as pd def OTT_read(xl, site_name): df = pd.read_excel(xl.io, site_name, skiprows=2, parse_dates=0, index_col=0, usecols=[0, 1, 2], header=None, names=['date_time', f'{site_name}_depth', f'{site_name}_temp']) return df def make_OTT_df(FILEDIR, OTT_FILE): xl = pd.ExcelFile(FILEDIR + OTT_FILE) site_names = xl.sheet_names df_list = [OTT_read(xl, site_name) for site_name in site_names] return site_names, df_list FILEDIR = 'c:/downloads/' OTT_FILE = 'OTT_Data_All_stations.xlsx' site_names_OTT, df_list_OTT = make_OTT_df(FILEDIR, OTT_FILE)
在Python中读取非常大的Excel文件(使用pandas,约有500,000行)可能会遇到性能问题。为了解决这个问题,可以使用xlsx2csv将Excel文件在内存中虚拟转换为csv文件,这样可以将读取时间减少约一半。
以下是使用xlsx2csv和pandas读取Excel文件的代码示例:
from xlsx2csv import Xlsx2csv from io import StringIO import pandas as pd 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
然而,上述代码可能已经过时。如果要使用这段代码,请尝试以下更新后的代码:
from xlsx2csv import Xlsx2csv from io import StringIO from openpyxl import load_workbook import pandas as pd def read_excel(path: str, sheet_index: int) -> pd.DataFrame: buffer = StringIO() Xlsx2csv(path, outputencoding="utf-8").convert(buffer, sheetid=sheet_index) buffer.seek(0) df = pd.read_csv(buffer, low_memory=False) return df
在我的测试中,使用`pd.read_excel(excel_file, sheet_name=None)`和使用`Xlsx2csv`版本之间的性能差异很小,有时`Xlsx2csv`会稍慢一些。我的文件有5个工作表,每个工作表有两列和约9,000行。
在我的实践中,使用`Xlsx2csv`可以节省大约40%的时间。
问题出现的原因是读取非常大的Excel文件(约500,000行)时,使用pandas库的read_excel函数速度较慢。为了解决这个问题,可以使用csv文件读取方法来提高速度。以下是解决方法的具体步骤:
1. 首先,需要在Windows系统上安装Excel,并在Python中使用pandas库来调用Excel。
2. 使用vbscript脚本将Excel文件转换为csv格式。可以创建一个ExcelToCsv.vbs脚本,其中包含将Excel文件转换为csv文件的代码。
3. 在Python中调用vbscript脚本,使用subprocess库中的call函数执行vbscript脚本,将Excel文件转换为csv文件。
4. 使用pandas的read_csv函数读取转换后的csv文件,将数据存储在DataFrame对象中。
如果在Linux系统上遇到相同的问题,解决方法如下:
将脚本中的文件写入模式从'w'更改为'wb',即将f = open('ExcelToCsv.vbs','w')更改为f = open('ExcelToCsv.vbs','wb'),以解决"TypeError: write() argument must be str, not bytes"错误。
这个解决方法受益于stackoverflow上的两个问题:Convert XLS to CSV on command line和csv & xlsx files import to pandas data frame: speed issue。