2011-04-02 15 views
5

esta es mi xlsx:Cómo cargar datos de un archivo xlsx usando pitón

enter image description here

y quiero conseguir cambiar estos datos a un dict así:

{ 
    0:{ 
     'a':1, 
     'b':100, 
     'c':2, 
     'd':10 
    }, 
    1:{ 
     'a':8, 
     'b':480, 
     'c':3, 
     'd':14 
    } 
... 
} 

, así lo hizo alguien saber una lib de pitón para hacer esto, y comenzar desde la línea 124, y al final de la línea 141,

gracias

+0

Su primera salida dict tiene datos de las líneas 124 y 125; su segundo tiene datos de la línea 126 ... edite su pregunta. Confirme también que las columnas de datos que desea son B, C, E y G. –

+0

'xlrd' (a partir de la versión 0.8.0) admite la lectura de archivos' .xlsx' directamente. (El módulo "bolt-on" mencionado por John Machin en su respuesta finalmente se incorporó al paquete 'xlrd'.) Relacionado: http://stackoverflow.com/questions/4371163/reading-xlsx-files-using-python –

+0

Creo que te refieres a 'd: 12' para la primera parte; y qué tan grande es tu archivo? –

Respuesta

1

Opciones con xlrd:

(1) Su xlsx no se ve muy grande; guárdalo como xls.

(2) Use xlrd más el módulo de prueba beta de bolt-on xlsxrd (busque mi dirección de correo electrónico y solicítela); la combinación leerá los datos de los archivos xls y xlsx sin problemas (mismas API; examina el contenido del archivo para determinar si es xls, xlsx o un impostor).

En cualquiera de los casos, algo así como el código (no probado) a continuación debe hacer lo que quiere:

from xlrd import open_workbook 
from xlsxrd import open_workbook 
# Choose one of the above 

# These could be function args in real live code 
column_map = { 
    # The numbers are zero-relative column indexes 
    'a': 1, 
    'b': 2, 
    'c': 4, 
    'd': 6, 
    } 
first_row_index = 124 - 1 
last_row_index = 141 - 1 
file_path = 'your_file.xls' 

# The action starts here 
book = open_workbook(file_path) 
sheet = book.sheet_by_index(0) # first worksheet 
key0 = 0 
result = {} 
for row_index in xrange(first_row_index, last_row_index + 1): 
    d = {} 
    for key1, column_index in column_map.iteritems(): 
     d[key1] = sheet.cell_value(row_index, column_index) 
    result[key0] = d 
    key0 += 1 
1

Otra opción es openpyxl. He tenido la intención de probarlo, pero aún no he llegado a eso, así que no puedo decir lo bueno que es.

+0

Desde que publiqué esta respuesta, tuve la oportunidad de probar openpyxl. Es bastante fácil de usar. Logré escribir una hoja de cálculo bastante grande: 20 pestañas, cada una con 200 columnas y 500 filas. Utiliza alrededor de 2 GB de memoria para esa operación. También tiene un escritor optimizado de solo apéndice que el autor afirma que puede escribir una hoja de cálculo de tamaño ilimitado, pero no he tenido un motivo para probarlo todavía. – joshayers

0

Aquí hay una implementación muy aproximada usando solo la biblioteca estándar.

def xlsx(fname): 
    import zipfile 
    from xml.etree.ElementTree import iterparse 
    z = zipfile.ZipFile(fname) 
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')] 
    rows = [] 
    row = {} 
    value = '' 
    for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')): 
     if el.tag.endswith('}v'): # <v>84</v> 
      value = el.text 
     if el.tag.endswith('}c'): # <c r="A3" t="s"><v>84</v></c> 
      if el.attrib.get('t') == 's': 
       value = strings[int(value)] 
      letter = el.attrib['r'] # AZ22 
      while letter[-1].isdigit(): 
       letter = letter[:-1] 
      row[letter] = value 
     if el.tag.endswith('}row'): 
      rows.append(row) 
      row = {} 
    return dict(enumerate(rows)) 
1

Supongamos que tenemos los datos como estos:

a,b,c,d 
1,2,3,4 
2,3,4,5 
... 

Una de las muchas respuestas posibles en el 2014 es:

import pyexcel 


r = pyexcel.SeriesReader("yourfile.xlsx") 
# make a filter function 
filter_func = lambda row_index: row_index < 124 or row_index > 141 
# apply the filter on the reader 
r.filter(pyexcel.filters.RowIndexFilter(filter_func)) 
# get the data 
data = pyexcel.utils.to_records(r) 
print data 

Ahora los datos es un conjunto de diccionarios:

[{ 
    'a':1, 
    'b':100, 
    'c':2, 
    'd':10 
}, 
{ 
    'a':8, 
    'b':480, 
    'c':3, 
    'd':14 
}... 
] 

La documentación se puede leer here

Cuestiones relacionadas