Pythonissa dataa helpommin tiedostoon

empty 13.06.04 12:50

Pari rutiinia jotka helpottavat tekstin, muuttujien ja binääridatan kirjoittamista tiedostoon.

 Tekstiversio  Arvo: 1 (1 ääntä)  Äänestä: +  -
"""Näitä rutiineja käytän aika paljon tiedostoon
kirjoittamiseen ja sieltä lukemiseen. Ei näissä
mitään ihmeellistä ole, mutta yllättävän
monet käyttävät jatkuvasti samoja ~5-rivisiä
koodinpätkiä tiedostoon kirjoittamiseen vaikka
samat asiat voi hoitaa parilla funktiolla.

Normaalisti jos kirjoittaisit

f = file('blah.txt', 'w')
try:
    f.write('jee')
finally:
    f.close()
   
se onnistuu myös näin:

textToFile('blah.txt', 'jee')

Ehkä hyödyllisimmät ovat silti dataToFile ja dataFromFile,
joilla tiedostoon voi laittaa lähes mitä tahansa.

Esim. jos teet pitkän laskun muutamalla funktiolla

hakemistot = tutkiKaikkiAlihakemistot('c:\\')
vastaus = laskeJotain(hakemistot)

Niin voi olla hyödyllistä laittaa välitulokset tiedostoon
ettei tartte aina jokaista välivaihetta laskea uudestaan.

dataToFile('hakemistot', tutkiKaikkiAlihakemistot('c:\\'))
vastaus = laskeJotain(dataFromFile('hakemistot'))

Siitä sitten vain kommentoi ekan rivin pois kunhan
kaikki alihakemistot on rouskutettu läpi kertaalleen.

Tai monta muuttujaa menee tietty tuplena:

# pelin päättyessä
dataToFile('config', (self.config, self.keys))

...

# pelin käynnistyessä
self.config, self.keys = dataFromFile('config')
"
""


def _toFile(fn, data, access=''):
    f = file(fn, 'w'+access)
    try:
        f.write(data)
    finally:
        f.close()


def _fromFile(fn, access=''):
    f = file(fn, 'r'+access)
    try:
        return f.read()
    finally:
        f.close()


def bytesFromFile(filename): return _fromFile(filename, 'b')
def textFromFile(filename): return _fromFile(filename)
def linesFromFile(filename): return textFromFile(filename).split('\n')

def bytesToFile(filename, bytes): _toFile(filename, bytes, 'b')
def textToFile(filename, text): _toFile(filename, text)
def linesToFile(filename, lines): textToFile(filename, '\n'.join(lines))


def dataToFile(filename, data, compress=False):
    """Save 'data' to file. 'data' can be any pickleable variable.
   
    Uses cPickle in binary mode. Optional compression uses bz2."
""
    import cPickle
   
    f = file(filename, 'wb')
    try:
        if not compress:
            return cPickle.dump(data, f, True)

        import bz2
        from cStringIO import StringIO
        out = StringIO()
        cPickle.dump(data, out, True)
        f.write(bz2.compress(out.getvalue()))
        out.close()
    finally:
        f.close()


def dataFromFile(filename, compress=False):
    """Load data from file and return it."""
    import cPickle

    f = file(filename, 'rb')
    try:
        if not compress:
            return cPickle.load(f)

        import bz2
        from cStringIO import StringIO
        inp = StringIO(bz2.decompress(f.read()))
        data = cPickle.load(inp)
        inp.close()
        return data
    finally:
        f.close()
 

ane 21:46 29.7.04 
Ihan kätevä. Pitää ottaa esiin kun ensi kerralla jotain koodaa.