2015-07-02 3 views
6

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

Я создал скрипт 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: Я использую окна 7 и питон 3.4.3. Я также открыт для решений в R, VBA или SPSS.

+0

Вам не нужен файл.close() после a с блоком – joeButler

ответ

6

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

Кроме того, вам не нужно закрывать инструкцию 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()) 

От Documentation -

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

+0

Что делать, если мне тоже нужно записать в файл? – Ariel