trabajar salida obtener manejo llamar importar datos como cargar archivos archivo python openpyxl

python - salida - ¿Es posible obtener el recuento de filas de un documento de Excel sin cargar todo el documento en la memoria?



salida en excel python (4)

La solución sugerida en esta respuesta ha quedado obsoleta y es posible que ya no funcione.

Echando un vistazo al código fuente de OpenPyXL ( IterableWorksheet ) he descubierto cómo obtener el recuento de columnas y filas de una hoja de trabajo del iterador:

wb = load_workbook(path, use_iterators=True) sheet = wb.worksheets[0] row_count = sheet.get_highest_row() - 1 column_count = letter_to_index(sheet.get_highest_column()) + 1

IterableWorksheet.get_highest_column devuelve una cadena con la letra de la columna que puede ver en Excel, por ejemplo, "A", "B", "C", etc. Por lo tanto, también escribí una función para traducir la letra de la columna a un índice basado en cero:

def letter_to_index(letter): """Converts a column letter, e.g. "A", "B", "AA", "BC" etc. to a zero based column index. A becomes 0, B becomes 1, Z becomes 25, AA becomes 26 etc. Args: letter (str): The column index letter. Returns: The column index as an integer. """ letter = letter.upper() result = 0 for index, char in enumerate(reversed(letter)): # Get the ASCII number of the letter and subtract 64 so that A # corresponds to 1. num = ord(char) - 64 # Multiply the number with 26 to the power of `index` to get the correct # value of the letter based on it''s index in the string. final_num = (26 ** index) * num result += final_num # Subtract 1 from the result to make it zero-based before returning. return result - 1

Todavía no he descubierto cómo obtener los tamaños de columna, así que decidí usar una fuente de ancho fijo y columnas escaladas automáticamente en mi aplicación.

Estoy trabajando en una aplicación que procesa enormes archivos de Excel 2007, y estoy usando OpenPyXL para hacerlo. OpenPyXL tiene dos métodos diferentes para leer un archivo de Excel: un método "normal" en el que todo el documento se carga en la memoria a la vez, y un método donde los iteradores se utilizan para leer fila por fila.

El problema es que cuando uso el método del iterador, no obtengo ningún metadato de documento como el ancho de columna y el recuento de fila / columna, y realmente necesito esta información. Supongo que estos datos se almacenan en el documento de Excel cerca de la parte superior, por lo que no debería ser necesario cargar todo el archivo de 10 MB en la memoria para acceder a él.

Entonces, ¿hay alguna forma de conocer el recuento de filas / columnas y el ancho de las columnas sin cargar primero todo el documento en la memoria?


Esto podría ser extremadamente intrincado y podría perderme lo obvio, pero sin el relleno de OpenPyXL en las dimensiones_columna en hojas de trabajo Iterables (vea mi comentario anterior), la única forma en que puedo ver el tamaño de la columna sin cargar todo es analizar directamente el xml :

from xml.etree.ElementTree import iterparse from openpyxl import load_workbook wb=load_workbook("/path/to/workbook.xlsx", use_iterators=True) ws=wb.worksheets[0] xml = ws._xml_source xml.seek(0) for _,x in iterparse(xml): name= x.tag.split("}")[-1] if name=="col": print "Column %(max)s: Width: %(width)s"%x.attrib # width = x.attrib["width"] if name=="cols": print "break before reading the rest of the file" break



Agregando a lo que dijo Hubro, aparentemente get_highest_row() ha sido desaprobado. El uso de las propiedades max_row y max_column devuelve el recuento de filas y columnas. Por ejemplo:

wb = load_workbook(path, use_iterators=True) sheet = wb.worksheets[0] row_count = sheet.max_row column_count = sheet.max_column