当我不需要所有的行和列时,如何使用Pandas with read_*(file)加速文件读取?

2024-06-25 23:52:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道还有一些其他的线程解释如何处理大文件和熊猫,但事实上,我没有内存问题,我只想每次打开很多Excel文件来获取一堆行(有时甚至只有一行),有时我甚至不需要所有的列

我在其他线程中看到有人建议使用usecolsnrows,但pandas似乎仍然加载整个工作表,然后只保留选定的行和列。可以肯定的是,我写了以下内容:

start = time.time()
couples2015 = pd.read_excel(fileInput)
total = time.time() - start

#Reloading file, with only some lines and cols
start = time.time()
couples2015 = pd.read_excel(fileInput,  header=4,  usecols=0,  nrows=10)
total = time.time() - start

在这两种情况下,加载都需要大约55秒

这只适用于50个月的文件,但我必须加载&;提取大量文件,从50个月到500个月(有时甚至高达1 Gb)

有没有一种方法可以在不加载整个文件的情况下提取一些行和列? 如果不是,使用我的excel文件创建数据库以使用read\u sql\u table()会更快吗

谢谢

[编辑:此外,每个文件都有几个工作表,但我通常只需要一到两张。即使在我使用sheet_name=0时,它似乎仍然打开并加载每个工作表,因为时间几乎相同…]


Tags: 文件内存readtime情况线程excelstart
1条回答
网友
1楼 · 发布于 2024-06-25 23:52:09

如果使用Excel用于Windows,请考虑通过与安装的Excel驱动程序的ODBC连接直接使用Jet/ACE SQL Engine(Windows .dll文件)查询工作簿。这样,每个工作表都充当一个数据库表,典型的SQL语义(JOINUNIONWHEREGROUP BY)是可用的,可以用^{}读取

使用实际列、工作表和范围调整下面的SQL语句

import pyodbc
import pandas as pd

strfile = "C:\Path\To\Workbook.xlsx"

conn = pyodbc.connect(r'Driver={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DBQ={};'
                      .format(strfile), autocommit=True)    

strSQL = """SELECT Col1, Col2, Col3 
            FROM [Sheet1$A4:C10]
         """ 

df = pd.read_sql(strSQL, conn)

conn.close()

<>对于没有标题的数据,请考虑一个内联Excel查询,它指定在指定范围的第一行上没有标题和数据。

strSQL = """SELECT F1, F2, F3
            FROM [Excel 12.0 Xml;HDR=NO;IMEX=1;Database=C:\Path\To\Same\Workbook.xlsx].[Sheet$A6:L10000]
            WHERE F2 = 'Some Value';
         """ 

顺便说一下,如果最后一行未知,只需给它一个非常大的数字。查询引擎仅选择已使用的行

相关问题 更多 >