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 не смогут справиться с этой нагрузкой. К счастью, есть два режима, которые позволяют читать и записывать неограниченное количество данных (около) постоянное потребление памяти.