Python: чтение больших листов Excel с помощью Openpyxl

У меня есть файл Excel, содержащий около 400 листов, 375 из которых мне нужно сохранить как CSV-файлы. Я пробовал решение VBA, но Excel имеет проблемы только с открытием этой книги.

Я создал скрипт python для этого. Однако он быстро потребляет всю доступную память и практически перестает работать после экспорта 25 листов. У кого-нибудь есть предложения о том, как я могу улучшить этот код?

import openpyxl

import csv

import time

print(time.ctime())

importedfile = openpyxl.load_workbook(filename = "C:/Users/User/Desktop/Giant Workbook.xlsm", data_only = True, keep_vba = False)

tabnames = importedfile.get_sheet_names()

substring = "Keyword"

for num in tabnames:

    if num.find(substring) > -1:
        sheet=importedfile.get_sheet_by_name(num)        
        name = "C:/Users/User/Desktop/Test/" + num + ".csv"
        with open(name, 'w', newline='') as file:
            savefile = csv.writer(file)
            for i in sheet.rows:
                savefile.writerow([cell.value for cell in i])
        file.close()
print(time.ctime())

любая помощь будет оцененный.

спасибо

EDIT: я использую windows 7 и python 3.4.3. Я также открыт для решений в R, VBA или SPSS.

1 ответов


попробуйте использовать read_only=True собственность за load_workbook() класс, это вызывает рабочие листы, которые вы получаете IterableWroksheet, то есть вы можете только перебирать их, вы не можете напрямую использовать номера столбцов / строк для доступа к значениям ячеек в нем. Это обеспечит near constant memory consumption по данным документация .

кроме того, вам не нужно закрыть file, with заявление будет обрабатывать это для вас.

пример

import openpyxl

import csv

import time

print(time.ctime())

importedfile = openpyxl.load_workbook(filename = "C:/Users/User/Desktop/Giant Workbook.xlsm", read_only = True, keep_vba = False)

tabnames = importedfile.get_sheet_names()

substring = "Keyword"

for num in tabnames:

    if num.find(substring) > -1:
        sheet=importedfile.get_sheet_by_name(num)        
        name = "C:/Users/User/Desktop/Test/" + num + ".csv"
        with open(name, 'w', newline='') as file:
            savefile = csv.writer(file)
            for i in sheet.rows:
                savefile.writerow([cell.value for cell in i])
print(time.ctime())

С документация -

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