Quería saber cómo leer una columna completa sin la iteración de una hoja de excel utilizando win32com cliente para python.

OriginalEl autor Nischal Hp | 2013-09-02

3 Comentarios

  1. 1

    La forma más rápida sería la de utilizar el construido en el Range funcionalidad a través de la win32com.client de la API. Sin embargo, yo no soy un gran fan de él. Creo que la API es confuso y mal documentados, y su uso no es muy python (pero eso es sólo conmigo).

    Si la eficiencia no es un problema para usted, puede utilizar el excelente xlrd de la biblioteca. Así:

    import xlrd
    book = xlrd.open_workbooks('Book1')
    sheet = book.sheet_by_name('Sheet1')
    sheel.col(1)
    sheet.col(2)
    # and so on...

    Que le da el celular objetos. Para obtener puro valores, uso sheet.col_values (y hay un par de métodos que son reales lindo.

    Sólo recuerde que xlrd soporte para «excel leer», así que si quieres escribir a un archivo de excel que necesita una biblioteca diferente llamado «xlwt» (que también es bastante bueno, aunque en menor grado que xlrd en mi opinión).

    Sí, me hizo tratar de escribir esta pieza de código y estaba pensando , python puede ser utilizado para escribir lo menos posible, así que me preguntaba si había algo que me acabo de volver de una lista con los valores de la columna sin yo tener que escribir la iteración parte.
    Usted puede utilizar el xlrd biblioteca, espera un segundo, voy a añadir un ejemplo
    No. espero que ayude!
    Conceptualmente, creo que el OP está buscando una manera de recuperar todo un rango de «de una vez», como recuperar un conjunto de resultados utilizando SELECT de una base de datos. Es decir, cualquier «repitiendo» que se deben hacer durante la recuperación es manejado antes se pone a Python. En el caso de la base de datos, el motor de SQL puede ser la iteración de debajo de las mantas, pero todo lo que veo es un solo «valor de retorno», que pasa a contener varios valores dentro de ella. Así que para Excel, OP está buscando para especificar un rango, a continuación, tomar todos los valores «de una vez» a, digamos, una tupla. Esto puede o puede no ser posible; no sé COM lo suficientemente bien.
    Todo lo que se dice, no veo porque iteración debe ser evitado en el primer lugar. Quizás es debido a que el acceso de Excel a través de COM celda por celda es notoriamente lento. Operando en un rango de Excel es mucho más rápido que operan en una celda a la vez. Pero la lectura de los archivos directamente a través de xlrd (y que no impliquen COM) es generalmente lo suficientemente rápido.

    OriginalEl autor yuvi

  2. 9

    Puede leer una columna completa sin la iteración de una hoja utilizando el Range colección. Usted debe nunca use Cells si performacne es cualquier preocupación. Python usa el win32com módulo para interactuar con el COM de Excel de la biblioteca. Siempre que el uso de Python y COM (Excel, PowerPoint, Acess, ADODB, etc.) uno de sus mayores restricciones de rendimiento será IO entre COM y Python. Con el Range método que solo uno COM el método de llamada mientras con Cells que hacer uno para cada fila. Esto también sería más rápido si estaban haciendo lo mismo en VBA o .NET

    En la siguiente prueba que he creado una hoja de cálculo con 10 caracteres aleatorios en las celdas de la A1 a la A2000. I a continuación, se extraen estos valores en las listas de usar, tanto en Variedad y Células.

    import win32com.client
    app = win32com.client.Dispatch("Excel.Application")
    s = app.ActiveWorkbook.Sheets(1)
    
    def GetValuesByCells():
        startTime = time.time()
        vals = [s.Cells(r,1).Value for r in range(1,2001)]
        return time.time() - startTime
    
    def GetValuesByRange():
        startTime = time.time()
        vals = [v[0] for v in s.Range('A1:A2000').Value]
        return time.time() - startTime
    
    >>> GetValuesByRange()
    0.03600001335144043
    
    >>> GetValuesByCells()
    5.27400016784668

    En este caso, el Rango es de 2 órdenes de magnitud más rápido (146x) más rápido que las Células. Tenga en cuenta que el Rango de método devuelve un 2D lista en la que cada lista interna es una fila. La lista de iteración transpone vals en 2D de la lista en el interior de la lista es una columna.

    OK, estoy upvoting esto a pesar de que, en su forma actual, la verdad no me considero una respuesta. Para mí, este es un comentario muy largo. Por qué creo que todavía merece una upvote es que es en última instancia, más útil y más útil que cualquiera de las otras respuestas presentadas hasta el momento (a pesar de yuvi del ser aceptado ya). El fragmento de código que se muestra aquí es claramente el más cercano a ilustrar cómo «leer una columna completa sin recorrer … usando win32com«.
    Sólo miré de nuevo en esta respuesta y modificado para responder a la pregunta original
    Me pregunto qué tan bien lo hace contra xlrd. Si las diferencias son minúsculas, entonces xlrd sería un claro ganador
    No he probado mucho a mí mismo, pero creo que depende en gran medida de la naturaleza de los datos y la naturaleza de lo que estamos tratando de hacer. El más grande y más complicado el libro, la más grande es la ventaja de Excel tendrá, en cuanto a la carga de tiempo a solas. Cuanto más que usted puede confiar en el propio Excel para hacer el trabajo pesado (a través de sus gamas y su motor de cálculo), la más grande es la ventaja de Excel. Sólo asegúrese de hacer tan pocos y tan productivo COM llamadas como sea posible.

    OriginalEl autor Michael David Watson

  3. 2

    Has mirado en el openpyxl de la biblioteca? A partir de la documentación:

    from openpyxl import load_workbook
    wb = load_workbook(filename='file.xlsx')
    ws = wb.get_sheet_by_name(name='Sheet1')
    columns = ws.columns()

    También hay soporte para los iteradores y otras golosinas.

    Esto no funcionará si el archivo es .xls.

    OriginalEl autor PattimusPrime

Dejar respuesta

Please enter your comment!
Please enter your name here