Как ускорить чтение файла с Pandas с чтением _ * (файл), когда мне не нужны все строки и столбцы? - PullRequest
0 голосов
/ 09 апреля 2020

Я знаю, что есть некоторые другие потоки, которые объясняют, как обращаться с большими файлами и Pandas, но на самом деле у меня нет проблем с памятью, я просто хочу открыть много файлов Excel, чтобы получить кучу строк каждый раз (иногда даже только один), а иногда мне даже не нужны все столбцы.

Я видел в других темах людей, предлагающих usecols и nrows, но кажется, что 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 Гб)

Есть ли способ извлечь некоторые строки и столбцы без загрузки целых файлов? Если нет, то будет ли создание БД с моими файлами Excel для использования read_sql_table () быстрее?

Спасибо!

[edit: более того, каждый файл имеет несколько листов, но я часто хочу только один или два. Даже если я использую sheet_name = 0, кажется, что он все еще открывается и загружает любой лист, так как время почти такое же…]

1 Ответ

2 голосов
/ 09 апреля 2020

Если вы используете Excel для Windows, рассмотрите возможность прямого запроса к книгам с помощью Jet / ACE SQL Engine (Windows .dll файлы) через ODB C соединение с установленным драйвером Excel , При этом каждый лист служит таблицей базы данных, и типичная семантика SQL (JOIN, UNION, WHERE, GROUP BY) доступна и может быть прочитана с помощью pandas.read_sql.

Отрегулируйте ниже 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';
         """ 

Кстати, если ваш последний ряд неизвестен, просто дайте ему очень большое число. Механизм запросов выбирает только используемые строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...