Vraag Hoe lees ik een Excel-bestand in Python met behulp van xlrd? Kan het nieuwere Office-indelingen lezen?


Mijn probleem is hieronder, maar zou geïnteresseerde reacties van iedereen met ervaring met xlrd zijn.

Ik heb xlrd gevonden en het lijkt de perfecte oplossing, maar ik heb een klein probleempje om te beginnen. Ik probeer gegevens te extraheren uit een Excel-bestand dat ik van Dow Jones heb opgehaald met de huidige componenten van de Dow Jones Industrial Average (link: http://www.djindexes.com/mdsidx/?event=showAverages)

Wanneer ik het bestand ongemodificeerd open, krijg ik een vervelende BIFF-fout (binair formaat niet herkend)

U kunt echter in deze schermafbeelding zien dat Excel 2008 voor Mac denkt dat het in het formaat 'Excel 1997-2004' is (screenshot: http://skitch.com/alok/ssa3/componentreport-dji.xls-properties)

Als ik het in plaats daarvan handmatig in Excel open en als 'Excel 1997-2004' format expliciet opsla, dan open in python usig xlrd, alles is geweldig. Onthoud dat Office denkt dat het bestand al in de indeling 'Excel 1997-2004' staat. Alle bestanden zijn .xls

Hier is een pastebin van een ipython-sessie die het probleem repliceert: http://pastie.textmate.org/private/jbawdtrvlrruh88mzueqdq

Alle gedachten over: Hoe xlrd te misleiden naar het herkennen van het bestand, zodat ik gegevens kan extraheren? Hoe gebruik je python om het expliciete 'opslaan als'-formaat te automatiseren in een formaat dat xlrd accepteert? Plan B?


11
2017-09-24 02:05


oorsprong


antwoorden:


FWIW, ik ben de auteur van xlrd en de onderhouder van xlwt (een vork van pyExcelerator). Een paar punten:

  1. Het bestand ComponentReport-DJI.xls heeft de verkeerde naam; het is geen XLS-bestand, het is een bestand met door tabs gescheiden waarden. Open het met een teksteditor (bijvoorbeeld Kladblok) en u zult zien wat ik bedoel. Je kunt ook de niet-erg ruwe onbewerkte bytes bekijken met Python:

    >>> open('ComponentReport-DJI.xls', 'rb').read(200)
    'COMPANY NAME\tPRIMARY EXCHANGE\tTICKER\tSTYLE\tICB SUBSECTOR\tMARKET CAP RANGE\
    tWEIGHT PCT\tUSD CLOSE\t\r\n3M Co.\tNew York SE\tMMM\tN/A\tDiversified Industria
    ls\tBroad\t5.15676229508\t50.33\t\r\nAlcoa Inc.\tNew York SE\tA'
    

    Je kunt dit bestand lezen met behulp van de csv-module van Python ... gewoon gebruiken delimiter="\t" in uw oproep aan csv.reader().

  2. xlrd kan elk bestand lezen dat pyExcelerator kan, en ze beter lezen - datums komen niet uit als drijvers, en het volledige verhaal op Excel-datums staat in de xlrd-documentatie.

  3. pyExcelerator is abandonware-xlrd en xlwt zijn springlevend. Uitchecken http://groups.google.com/group/python-excel

HTH John


26
2017-09-23 01:14



xlrd-ondersteuning voor Office 2007/2008 (OpenXML) -indeling is in alfatest - zie het volgende bericht in de python-excel-nieuwsgroep: http://groups.google.com/group/python-excel/msg/0c5f15ad122bf24b?hl=en 


3
2017-09-23 02:33



Meer info op pyExcelerator: Om een ​​bestand te lezen, doe dit:

import pyExcelerator
book = pyExcelerator.parse_xls(filename)

waarbij bestandsnaam een ​​tekenreeks is die de bestandsnaam is die moet worden gelezen (niet een bestand-achtig object). Hiermee krijgt u een gegevensstructuur die de werkmap vertegenwoordigt: een lijst met paren, waarbij het eerste element van het paar de naam van het werkblad is en het tweede element de werkbladgegevens.

De werkbladgegevens zijn een woordenboek, waarbij de sleutels (rij, kolom) paren zijn (beginnend met 0) en de waarden de celinhoud zijn - meestal int, zwevend of tekenreeks. Dus bijvoorbeeld in het simpele geval dat alle gegevens op het eerste werkblad staan:

data = book[0][1]
print 'Cell A1 of worksheet %s is: %s' % (book[0][0], repr(data[(0, 0)]))

Als de cel leeg is, ontvangt u een KeyError. Als je met dates bezig bent, zij mei (Ik ben vergeten) doorkomen als gehele getallen of drijvers; als dit het geval is, moet u converteren. In principe is de regel: datetime.datetime (1899, 12, 31) + datetime.timedelta (days = n) maar dat is misschien 1 of 2 (omdat Excel 1900 behandelt als een schrikkeljaar voor compatibiliteit met Lotus, en omdat Ik kan me niet herinneren of 1900-1-1 gelijk is aan 0 of 1), dus probeer het eens en voor de proef te nemen. Datimes worden opgeslagen als drijvers, denk ik (dagen en breuken van een dag).

Ik denk dat er gedeeltelijke ondersteuning is voor forumulas, maar ik zou niets garanderen.


1



Wel, hier is wat code die ik heb gedaan: (kijk onderaan): hier

Niet zeker over de nieuwere formaten - als xlrd het niet kan lezen, moet xlrd een nieuwe versie hebben vrijgegeven!


0



Heb je xlrd nodig? Ik heb zojuist 'UPDATE - Dow Jones Industrial Average Movers - 2008' gedownload van die website en had er geen moeite mee om het te lezen pyExcelerator.

import pyExcelerator
book = pyExcelerator.parse_xls('DJIAMovers.xls')

-1