Analiza dokumentów excel z openpyxl

0

Witam potrzebuje przeanalizować kilkanaście plików .xlsx, używam do tego pythona i biblioteki openpyxl.

import openpyxl
import time
while True:
    todo = os.listdir("C:\\sciezka\dozrobienia\\")
    if len(todo) != 0:
        excel = openpyxl.load_workbook('C:\\sciezka\\dozrobienia\\' + todo[0])
        excelws = excel.get_sheet_by_name('Sheet1')

#v chwilowo by sprawdzić czy działa
        f = open("notatki.txt", "a")
        f.write(todo[0] + '\n')
        for row in range(10,excelws.max_row):
            if excelws['B'+str(row)].value is not None:
                f.write(str(excelws['A'+str(row)].value)+str(excelws['B'+str(row)].value) + '\n')
        f.close()
#^chwilowo by sprawdzić czy działa

        excel.save("C:\\sciezka\\zakonczone\\" + todo[0])

    time.sleep(1)

Problem polega na tym, że jak użyje excel=openpyxl.load_workbook() dla pierwszego pliku, ten zostaje w pamięci i nie chce załadować pliku drugiego do czasu zresetowania programu

próbowałem użyć del excel, excel=None czy excel.close() nie działa niestety

0

excel = openpyxl.load_workbook('C:\\sciezka\\dozrobienia\\' + todo[0]) na oko ładujesz ten sam plik cały czas, stąd pewnie problem bo jakiś handle trzymasz a pewnie default to otwarcie read-write.

0
Shalom napisał(a):

na oko ładujesz ten sam plik cały czas

zapomniałem wkleić ale na końcu usuwa ten pierwszy plik z tej lokalizacji ponieważ został on przeniesiony więc todo[0] jest już inną wartością. Tak otwiera się w trybie read/write, nie wiem dlaczego ale po zmianie na samo read program zdaje się gdzieś zacinać ponieważ nic się nie dzieje (oczywiście excel.save() wtedy usuwam bo nie może zapisać)

0

Jak to todo[0] jest inną wartością? Z kodu to nie wynika. Skąd usuwasz z listy czy z dysku?

0
yarel napisał(a):

Jak to todo[0] jest inną wartością? Z kodu to nie wynika. Skąd usuwasz z listy czy z dysku?

z dysku
os.remove('C:\\sciezka\\' + todo[0]) < tego brakuje

0

Jak według Ciebie działa todo = os.listdir("C:\\sciezka\dozrobienia\\") ?

edycja:
Dobra, nie chce mi się krok po kroku :P Usuwasz z dysku, nie z listy, więc todo[0] zawszę będzie tym samym...

0
yarel napisał(a):

Jak według Ciebie działa todo = os.listdir("C:\\sciezka\dozrobienia\\") ?

edycja:
Dobra, nie chce mi się krok po kroku :P Usuwasz z dysku, nie z listy, więc todo[0] zawszę będzie tym samym...

usuwam z dysku a potem zastępuje todo powtarzając todo = os.listdir("C:\\sciezka\dozrobienia\\")

1
  1. Możesz zmodyfikować przetwarzanie, tj. rozbić na 3 części: pobranie listy plików, przetworzenie, posprzątanie, dzięki temu:
  • będziesz generował ~50% mniej wywołań systemowych (listdir() tylko raz, a nie co plik)
  • zobaczysz czy pliki przetwarzają się poprawnie czy problem leży w usuwaniu (np. coś trzyma uchwyt)
  1. Pobierz https://docs.microsoft.com/en-us/sysinternals/downloads/handle i sprawdź czy uchwyt do tego pliku "pierwszego" mimo wszystko nie jest trzymany przez proces.

  2. Sprawdź wersję openpyxl - może są jakieś babole, w tej której używasz

0

A nie lepiej użyć pandas ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1