La nueva versión de Pandas utiliza la siguiente interfaz para cargar archivos de Excel:
read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])
pero ¿y si no conozco las hojas disponibles?
Por ejemplo, estoy trabajando con archivos de Excel que las siguientes hojas
Datos 1, Datos 2 ..., Datos N, foo, bar
Pero no sé N
a priori.
¿Hay alguna forma de obtener la lista de hojas de un documento de Excel en Pandas?
ExcelFile
? Además, supongamos que busco la lista de hojas y decido cargar N de ellas, ¿en ese momento debería llamarread_excel
(a la nueva interfaz) para cada hoja o apegarmex1.parse
?{sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
Debe especificar explícitamente el segundo parámetro (nombre de hoja) como Ninguno. Me gusta esto:
"df" son todas las hojas como un diccionario de DataFrames, puede verificarlo ejecutando esto:
resultado como este:
consulte pandas doc para obtener más detalles: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
fuente
Esta es la forma más rápida que he encontrado, inspirada en la respuesta de @ divingTobi. Todas Las respuestas basadas en xlrd, openpyxl o pandas son lentas para mí, ya que todas cargan primero todo el archivo.
fuente
Basándose en la respuesta de @dhwanil_shah, no es necesario extraer todo el archivo. Con
zf.open
esto es posible leer directamente desde un archivo comprimido.Los dos
readline
s consecutivos son feos, pero el contenido está solo en la segunda línea del texto. No es necesario analizar todo el archivo.Esta solución parece ser mucho más rápida que la
read_excel
versión, y muy probablemente también más rápida que la versión de extracto completo.fuente
He intentado xlrd, pandas, openpyxl y otras bibliotecas similares, y todas parecen llevar un tiempo exponencial a medida que aumenta el tamaño del archivo a medida que lee todo el archivo. Las otras soluciones mencionadas anteriormente donde usaban 'on_demand' no funcionaron para mí. Si solo desea obtener los nombres de las hojas inicialmente, la siguiente función funciona para los archivos xlsx.
Dado que todos los xlsx son básicamente archivos comprimidos, extraemos los datos xml subyacentes y leemos los nombres de las hojas del libro directamente, lo que lleva una fracción de segundo en comparación con las funciones de la biblioteca.
Evaluación comparativa: (en un archivo xlsx de 6mb con 4 hojas)
Pandas, xlrd: 12 segundos
openpyxl: 24 segundos
Método propuesto: 0.4 segundos
Como mi requisito era solo leer los nombres de las hojas, la sobrecarga innecesaria de leer todo el tiempo me estaba molestando, así que tomé esta ruta en su lugar.
fuente
zipfile
módulo integrado y elxmltodict
que convertí el XML en un diccionario fácilmente iterable. Aunque puede ver la respuesta de @ divingTobi a continuación, donde puede leer el mismo archivo sin extraer realmente los archivos.load_workbook(excel_file).sheetnames
promedió 8.24s dondeload_workbook(excel_file, read_only=True).sheetnames
promedió 39.6ms.Para un archivo de Excel de 5MB con el que estoy trabajando,
load_workbook
sin laread_only
bandera tomó 8.24s. Con laread_only
bandera solo tardó 39,6 ms. Si aún desea utilizar una biblioteca de Excel y no utilizar una solución xml, es mucho más rápido que los métodos que analizan todo el archivo.fuente