Nowa wersja Pandas używa następującego interfejsu do ładowania plików Excel:
read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])
ale co, jeśli nie znam dostępnych arkuszy?
Na przykład pracuję z plikami programu Excel, które znajdują się poniżej
Dane 1, Dane 2 ..., Dane N, foo, bar
ale nie wiem N
a priori.
Czy jest jakiś sposób, aby uzyskać listę arkuszy z dokumentu Excela w Pandach?
ExcelFile
? Powiedzmy również, że przeglądam listę arkuszy i decyduję się załadować N z nich. Czy powinienem w tym momencie wywołaćread_excel
(nowy interfejs) dla każdego arkusza, czy trzymać sięx1.parse
?{sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
Należy jawnie określić drugi parametr (nazwa arkusza) jako Brak. lubię to:
„df” to wszystkie arkusze jako słownik DataFrames, możesz to sprawdzić, uruchamiając to:
wynik taki jak ten:
więcej szczegółów można znaleźć w dokumencie pandas: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
źródło
To najszybszy sposób, jaki znalazłem, zainspirowany odpowiedzią @ivingTobi. Wszystkie Odpowiedzi oparte na xlrd, openpyxl lub pandach są dla mnie powolne, ponieważ wszystkie ładują najpierw cały plik.
źródło
Opierając się na odpowiedzi @dhwanil_shah, nie musisz rozpakowywać całego pliku. Dzięki
zf.open
temu możliwe jest bezpośrednie odczytanie z pliku spakowanego.Dwa kolejne
readline
s są brzydkie, ale treść znajduje się tylko w drugim wierszu tekstu. Nie ma potrzeby analizowania całego pliku.To rozwiązanie wydaje się być znacznie szybsze niż
read_excel
wersja, a najprawdopodobniej także szybsze niż pełna wersja wypakowania.źródło
Wypróbowałem xlrd, pandas, openpyxl i inne tego typu biblioteki i wszystkie z nich wydają się zajmować wykładniczy czas, ponieważ rozmiar pliku rośnie, gdy odczytuje cały plik. Inne wymienione powyżej rozwiązania, w których używali „on_demand”, nie działały u mnie. Jeśli chcesz tylko początkowo uzyskać nazwy arkuszy, następująca funkcja działa dla plików xlsx.
Ponieważ wszystkie xlsx są w zasadzie spakowanymi plikami, wyodrębniamy podstawowe dane xml i czytamy nazwy arkuszy bezpośrednio ze skoroszytu, co zajmuje ułamek sekundy w porównaniu z funkcjami biblioteki.
Benchmarking: (na pliku 6mb xlsx z 4 arkuszami)
Pandy, xlrd: 12 sekund
openpyxl: 24 sekundy
Proponowana metoda: 0,4 sekundy
Ponieważ moim wymaganiem było po prostu czytanie nazw arkuszy, niepotrzebne obciążenie związane z czytaniem przez cały czas mnie niepokoiło, więc zamiast tego wybrałem tę trasę.
źródło
zipfile
który jest wbudowanym modułem ixmltodict
którego użyłem do konwersji XML na łatwo iterowalny słownik. Chociaż możesz spojrzeć na odpowiedź @ivingTobi poniżej, gdzie możesz odczytać ten sam plik bez faktycznego wyodrębniania plików w nim zawartych.load_workbook(excel_file).sheetnames
średnio 8,24s, gdzieload_workbook(excel_file, read_only=True).sheetnames
średnio 39,6ms.Dla 5MB pliku Excel, z którym pracuję,
load_workbook
bezread_only
flagi zajęło 8,24s. Zread_only
flagą zajęło to tylko 39,6 ms. Jeśli nadal chcesz korzystać z biblioteki programu Excel i nie upuszczać go do rozwiązania XML, jest to znacznie szybsze niż metody analizujące cały plik.źródło