Lee el archivo Excel XML .xls con pandas

Estoy al tanto de una serie de preguntas hechas anteriormente, pero ninguna de las soluciones dadas funciona con el ejemplo reproducible que se proporciona a continuación.

Estoy intentando leer en archivos .xls de http://www.eia.gov/coal/data.cfm#production – específicamente los datos históricos detallados de producción de carbón (1983-2013) coalpublic2012.xls que está disponible gratuitamente a través del desplegable. Las pandas no pueden leerlo.

En contraste, el archivo para el año más reciente disponible, 2013, el archivo coalpublic2013.xls , funciona sin problemas:

 import pandas as pd df1 = pd.read_excel("coalpublic2013.xls") 

pero la próxima década de archivos .xls (2004-2012) no se carga. He mirado estos archivos con Excel, se abren y no están dañados.

El error que recibo de los pandas es:

 --------------------------------------------------------------------------- XLRDError Traceback (most recent call last)  in () ----> 1 df = pd.read_excel("coalpublic2012.xlsx") /Users/jonathan/anaconda/lib/python2.7/site-packages/pandas/io/excel.pyc in read_excel(io, sheetname, header, skiprows, skip_footer, index_col, parse_cols, parse_dates, date_parser, na_values, thousands, convert_float, has_index_names, converters, engine, **kwds) 161 162 if not isinstance(io, ExcelFile): --> 163 io = ExcelFile(io, engine=engine) 164 165 return io._parse_excel( /Users/jonathan/anaconda/lib/python2.7/site-packages/pandas/io/excel.pyc in __init__(self, io, **kwds) 204 self.book = xlrd.open_workbook(file_contents=data) 205 else: --> 206 self.book = xlrd.open_workbook(io) 207 elif engine == 'xlrd' and isinstance(io, xlrd.Book): 208 self.book = io /Users/jonathan/anaconda/lib/python2.7/site-packages/xlrd/__init__.pyc in open_workbook(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows) 433 formatting_info=formatting_info, 434 on_demand=on_demand, --> 435 ragged_rows=ragged_rows, 436 ) 437 return bk /Users/jonathan/anaconda/lib/python2.7/site-packages/xlrd/book.pyc in open_workbook_xls(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows) 89 t1 = time.clock() 90 bk.load_time_stage_1 = t1 - t0 ---> 91 biff_version = bk.getbof(XL_WORKBOOK_GLOBALS) 92 if not biff_version: 93 raise XLRDError("Can't determine file's BIFF version") /Users/jonathan/anaconda/lib/python2.7/site-packages/xlrd/book.pyc in getbof(self, rqd_stream) 1228 bof_error('Expected BOF record; met end of file') 1229 if opcode not in bofcodes: -> 1230 bof_error('Expected BOF record; found %r' % self.mem[savpos:savpos+8]) 1231 length = self.get2bytes() 1232 if length == MY_EOF: /Users/jonathan/anaconda/lib/python2.7/site-packages/xlrd/book.pyc in bof_error(msg) 1222 if DEBUG: print("reqd: 0x%04x" % rqd_stream, file=self.logfile) 1223 def bof_error(msg): -> 1224 raise XLRDError('Unsupported format, or corrupt file: ' + msg) 1225 savpos = self._position 1226 opcode = self.get2bytes() XLRDError: Unsupported format, or corrupt file: Expected BOF record; found '<?xml ve' 

Y he intentado varias otras cosas:

 df = pd.ExcelFile("coalpublic2012.xls", encoding_override='cp1252') import xlrd wb = xlrd.open_workbook("coalpublic2012.xls") 

en vano. Mi versión de los pandas: 0.17.0

También he enviado esto como un error a la lista de problemas de pandas github.

Puede convertir este archivo XML de Excel mediante progtwigción. Requisito: sólo python y pandas.

 import pandas as pd from xml.sax import ContentHandler, parse # Reference https://goo.gl/KaOBG3 class ExcelHandler(ContentHandler): def __init__(self): self.chars = [ ] self.cells = [ ] self.rows = [ ] self.tables = [ ] def characters(self, content): self.chars.append(content) def startElement(self, name, atts): if name=="Cell": self.chars = [ ] elif name=="Row": self.cells=[ ] elif name=="Table": self.rows = [ ] def endElement(self, name): if name=="Cell": self.cells.append(''.join(self.chars)) elif name=="Row": self.rows.append(self.cells) elif name=="Table": self.tables.append(self.rows) excelHandler = ExcelHandler() parse('coalpublic2012.xls', excelHandler) df1 = pd.DataFrame(excelHandler.tables[0][4:], columns=excelHandler.tables[0][3]) 

El problema es que, si bien los datos de 2013 son un archivo de Excel real, los datos de 2012 son un documento XML, algo que parece no ser compatible con Python. Yo diría que lo mejor es abrirlo en Excel y guardar una copia como un archivo de Excel adecuado o como un CSV.

Puede convertir este archivo XML de Excel mediante progtwigción. Requisito: Windows, Office instalado.

1.Crear en el script ExcelToCsv.vbs del Bloc de notas:

 if WScript.Arguments.Count < 3 Then WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv   " Wscript.Quit End If csv_format = 6 Set objFSO = CreateObject("Scripting.FileSystemObject") src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0)) dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1)) worksheet_number = CInt(WScript.Arguments.Item(2)) Dim oExcel Set oExcel = CreateObject("Excel.Application") Dim oBook Set oBook = oExcel.Workbooks.Open(src_file) oBook.Worksheets(worksheet_number).Activate oBook.SaveAs dest_file, csv_format oBook.Close False oExcel.Quit 
  1. Convierta el archivo XML de Excel en CSV:

$ cscript ExcelToCsv.vbs coalpublic2012.xls coalpublic2012.csv 1

  1. Abre el archivo CSV con pandas.

>>> df1 = pd.read_csv('coalpublic2012.csv', skiprows=3)

Referencia: Manera más rápida de leer archivos de Excel en el dataframe pandas.

@JBWhitmore He ejecutado el siguiente código:

 import pandas as pd #Read and write to excel dataFileUrl = r"/Users/stutiverma/Downloads/coalpublic2012.xls" data = pd.read_table(dataFileUrl) 

Esto lee el archivo con éxito sin dar ningún error. Pero, da todos los datos en el formato exacto como se mencionó. Por lo tanto, es posible que tenga que hacer esfuerzos adicionales para procesar los datos después de leerlos con éxito.