Инструменты ввода-вывода Pandas хороши тем, что для простых случаев использования они делают правильные вещи и загружают весь файл одной (простой) командой.Недостатком является то, что они могут быть недостаточно универсальными для слишком сложных случаев использования.Поэтому я бы экспортировал лист Excel в csv и использовал модуль Python csv
для предварительной обработки файла:
def get_data(fd, cur_line, lines, cols):
rd = csv.reader(fd)
for first, last in row_index:
while cur_line < first:
_ = next(fd)
cur_line += 1
while cur_line <= last:
yield next(rd)[cols[0]:cols[1]]
cur_line += 1
def process(fd, col_index, row_index):
_ = next(fd) # skip first line
rd = csv.reader(fd)
row = next(rd)
columns = ['ix'] + row[col_index[0]:col_index[1]]
df = pd.DataFrame(get_data(fd, 3, row_index,
(col_index[0]-1, col_index[1])),
columns = columns).set_index('ix')
df.index.name = ''
return df
С вашим файлом я бы использовал:
col_index = (3,34)
row_index = ((5,15), (18,21), (24,75), (78,80), (84,92), (94,95))
df = process(open(csv_filename, newline=''), col_index, row_index)
Файл обрабатывается только один раз, только соответствующие строки обрабатываются, и только соответствующие столбцы используются для подачи кадра данных.Единственным ограничением является то, что игнорируемые строки не могут содержать многострочных полей.Если это необходимо, вы должны заменить next(fd)
на next(rd)
в вышеуказанных функциях, чтобы модуль csv мог обрабатывать многострочные поля.