2015-07-02 22 views
6

Mam plik Excel zawierający około 400 arkuszy, z których 375 muszę zapisać jako pliki CSV. Próbowałem już rozwiązanie VBA, ale w programie Excel występują problemy z otwieraniem tego skoroszytu.Python: czytanie dużych arkuszy programu Excel przy użyciu Openpyxl

Stworzyłem skrypt Pythona, aby to zrobić. Jednak szybko zużywa całą dostępną pamięć i prawie przestaje działać po wyeksportowaniu 25 arkuszy. Czy ktoś ma sugestię, w jaki sposób mogę poprawić ten kod?

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()) 

Każda pomoc zostanie doceniona.

Dzięki

EDIT: używam Windows 7 i Pythona 3.4.3. Jestem także otwarty na rozwiązania w R, VBA lub SPSS.

+0

Nie potrzebujesz pliku file.close() po bloku o numerze – joeButler

Odpowiedz

6

Spróbuj użyć właściwość read_only=True dla load_workbook() klasy, to powoduje, że arkusze można dostać się IterableWroksheet, dzięki czemu można iteracyjne tylko nad nimi, nie można bezpośrednio używać liczb kolumna/wiersz, aby uzyskać dostęp do wartości komórek w nim. Zapewniłoby to near constant memory consumption zgodnie z documentation.

Ponadto, nie trzeba zamykać oświadczenia, aby obsłużyć to za Ciebie.

Przykład -

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()) 

Od Documentation -

Czasami trzeba będzie otworzyć lub napisać bardzo dużych plików XLSX i wspólne procedury w openpyxl nie będzie w stanie sobie z tym poradzić obciążenie. Na szczęście istnieją dwa tryby, które umożliwiają odczytywanie i zapisywanie nieograniczonych ilości danych przy (prawie) stałym zużyciu pamięci.

+0

Co się stanie, jeśli będę musiał również napisać do pliku? – Ariel

Powiązane problemy