Excel-tiedoston lukeminen Pythonilla

Mehuwiki


... Tämä sivu on vielä keskeneräinen ...

Sisällysluettelo

Xlrd-kirjaston asentaminen ja testaus

Xlrd-kirjasto on puhdas Python-kirjasto, eli ei sisällä esim. C-kielisiä osia, eikä ole riippuvainen mistään muusta kirjastosta. Tämän vuoksi kirjaston asentaminen on yksinkertainen ja suoraviivainen toimenpide. Tästä huolimatta lue nämä ohjeet kertaalleen läpi, ennen kuin aloitat asentamisen.

Hae tiedosto xlrd-0.3a1.zip Lingfon sivulta http://www.lexicon.net/sjmachin/xlrd.htm. Pura pakattu tiedosto johonkin mielestäsi sopivaan hakemistoon. Valitulla hakemistolla ei ole merkitystä mutta seuraavassa oletetaan, että olet purkanut kirjaston hakemistoon ~/Python/xlrd-0.3a1.

Asenna kirjasto suorittamalla seuraava komento:

~/Python/xlrd-0.3a1.zip$ sudo python setup.py install 2>&1 | tee install.log

Komento suorittaa kirjaston asennusskriptin ja ohjaa asennuksesta syntyvän tulosteen myös tiedostoon install.log (varmuuden vuoksi).

Asennuksen aikana ainakin allekirjoittaneen koneella syntyy varoitus:

/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/distutils/dist.py:227:
UserWarning: Unknown distribution option: 'package_data'
  warnings.warn(msg)

Tällä varoituksella ei näyttäisi olevan mitään vaikutusta mutta toistaiseksi on vielä selvittämättä, pitäisikö asiasta huolestua.

Varmista, että kirjaston asentaminen onnistui. Siirry pois hakemistosta ~/Python/xlrd-0.3a1 ja suorita seuraava komento:

~/Python$ python -c "import xlrd"

Komento yrittää ladata Xlrd-kirjaston. Jos kirjaston lataus onnistuu, niin mitään virheilmoitusta ei synny eikä mitään muutakaan tapahdu. Asennus on onnistunut tällöin hyvin. Jos taas Python antaa virheilmoituksen, niin asennus on epäonnistunut.

Onnistuneen asennuksen jälkeen voit halutessasi poistaa kirjaston väliaikaisesta sijoituspaikastaan:

~/Python$ rm -rf xlrd-0.3a1

Xlrd-kirjaston toiminta

Kuva:Xlrd-luokkakaavio-01.png

Luokka Book

encoding

Työkirjan koodisivusta johdettu merkistön.

nsheets

Työkirjan välilehtien lukumäärä.

print "Työkirjassa on %d välilehteä" % tyokirja.nsheets
sheet_by_index(indeksi)

Metodi palauttaa indeksiä indeksi vastaavan välilehden. Mikäli indeksiä vastaavaa välilehteä ei löydy, metodi synnyttää poikkeuksen RangeError.

for indeksi in range(tyokirja.nsheets):
    lehti = tyokirja.sheet_by_index(indeksi)
    print "Välilehdellä %s on %d riviä ja %d saraketta" % \
          (str(lehti.name), lehti.nrows, lehti.ncols)

sheet_by_name(välilehden_nimi)

Metodi palauttaa annettua nimeä välilehden_nimi vastaavan välilehden. Palautettu välilehti on luokan Sheet ilmentymä. Jos nimeä vastaavaa välilehteä ei työkirjasta löydy, niin metodi synnyttää poikkeuksen <<2DO: Selvitä poikkeus>>.

for nimi in tyokirja.sheet_names():
    lehti = tyokirja.sheet_by_name(nimi)
    print "Välilehdellä %s on %d riviä ja %d saraketta" % \
          (str(lehti.name), lehti.nrows, lehti.ncols)
sheet_names()

Metodi palauttaa listan työkirjan välilehtien nimistä.

for nimi in tyokirja.sheet_names():
    print nimi
user_name

Tieto työkirjan viimeksi tallettaneen käyttäjän nimestä, mikäli vain saatavissa.

Esimerkki Excel-tiedoston lukemisesta

Oletamme, että käytössämme on seuraavanlainen Excel-taulukko nimeltään kertoimia.xls:

Kuva:Mtahti-excel-esimerkki-1.jpg

Seuraava Python-ohjelma lukee taulukon sisällön ja tulostaa sen perusteella listan lopputulosten yhdistelmistä.

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import xlrd

def ifthen(jos, niin, muutoin = None):
    "Kapseloi \"if: ... else: ...\" -rakenteen lausekkeeksi."
    if jos:
        return niin
    else:
        return muutoin

def yksmon(x, yks, mon):
    "Valitsee nominin numeruksen annetun luvun mukaan."
    return "%d %s" % (x, ifthen(x == 1, yks, mon))

xls = xlrd.open_workbook("kertoimia.xls")
print "Työkirjassa on %s." % yksmon(xls.nsheets, "lehti", "lehteä")

# Valitaan ensimmäinen (ja ainoa) lehti
lehti = xls.sheet_by_index(0)

def rowiter(sheet, first_row = 0):
    for r in range(first_row, sheet.nrows):
        yield [c.value for c in sheet.row(r)]

print "Yhd.\tPeli 1\tPeli 2\tPeli 3\tKerroin"
for (n, k1, v1, k2, v2, k3, v3, k, dummy) in rowiter(lehti, 4):
    print "%d.\t%d - %d\t%d - %d\t%d - %d\t%.2f" % (n, k1, v1, k2, v2, k3, v3, k)

Ohjelman tuottaa seuraavan lopputuloksen:

Yhd.    Peli 1  Peli 2  Peli 3  Kerroin
1.      2 - 0   1 - 1   1 - 0   200.16
2.      2 - 0   1 - 1   1 - 1   208.67
3.      3 - 0   1 - 1   1 - 0   232.49
4.      2 - 1   1 - 1   1 - 1   238.35
5.      2 - 0   0 - 1   1 - 0   245.15
6.      2 - 0   1 - 2   1 - 1   257.33
7.      2 - 1   1 - 1   1 - 0   258.95
8.      3 - 0   1 - 1   1 - 1   262.18
9.      1 - 1   1 - 1   1 - 1   268.60
10.     2 - 0   1 - 1   2 - 0   273.16
Henkilökohtaiset työkalut

Creative Commons License