Práce se soubory

Soubory jsou velice důležité, protože obsahují data. Jako soubor se chovají i některá vstupní a výstupní zařízení, síťová připojení a podobně.

Základní operace se soubory jsou otevření, zápis a zavření. Při otevírání vznikne nový objekt, se kterým dále pracujeme.

data_soubor = open('data.txt', 'r')

data = data_soubor.read()

data_soubor.close()

Tento příklad - vytvořil novou proměnnou typu file v režimu read, na dalším řádku ze souboru přečetl všechna data a uložil do proměnné data a nakonec soubor uzavřel.

Lepší je ale využít konstrukci s blokem with, která soubor automaticky uzavře (i pokud mezitím např. dojde k výjimce) - konečné close() pak již není potřeba.

with open('data.txt', 'r') as data_soubor:
    data = data_soubor.read()

Pojďme vytvořit soubor typu JSON, který bude obsahovat jeden bod ve formátu GeoJSON:

import json
from shapely.geometry import Point, mapping

# vytvoříme bod a uložíme do struktury JSON
bod = Point(100, 100)
data = mapping(bod)

# vytvoříme nový objekt typu soubor a uložíme do něj json jako textový
# řetězec
with open('/tmp/output.json', 'w') as file_out: # soubor otevřeme v režimu "write"
    file_out.write(json.dumps(data))

Výsledný soubor si můžeme prohlédnout v programu QGIS.

Poznámka

Vhodnější by jinak bylo použít funkci json.dump(), která jako parametr potřebuje práve file-like objekt, do kterého data zapíše přímo json.dump(file_out, data)

Režimy otevření souborů

Soubory můžeme otevřít ve 3 režimech: read, write, append - tedy v režimu pro čtení, zápis a přidávání obsahu na konec souboru. Odpovídající parametry pro funkci open() jsou r, w, a.

pridat_na_konec = open('soubor.txt', 'a')
pridat_na_konec.write('text, ktery bude az na konci souboru\n')
pridat_na_konec.close()

nebo lépe

with open('soubor.txt', 'a') as pridat_na_konec:
    pridat_na_konec.write('text, ktery bude az na konci souboru\n')

Poznámka

funkce souboru write() na rozdíl od print() nevkládá znak pro nový řádek na konec řádku a musíte ho tam vložit sami (proto \n nakonci)

Zavírání souborů

Je čisté (a z pohledu souborového systému i bezpečné) soubor na konci práce s ním uzavřít funkcí close(). Někdy je výhodnější kompatní zápis, kdy soubor bude otevřen jenom v rámci daného bloku kódu:

with file_out as open('/tmp/output.json', 'w'):
    file_out.write(json.dumps(data))

V tomto případě je soubor automaticky uzavřen na konci bloku uvozeného slovem with.

Bezpečné čtení ze souboru

Funkce read() načte veškerý obsah souboru - bez ohledu na jeho velikost, na velikost vaší paměti, na jeho obsah. Používejte proto tuto funkci s rozmyslem.

Pokud načítáte textové soubory, zvažte použití funkce readlines(), která načte soubor po řádcích:

for line in soubor.readlines():
    # pracuj s řádkem

Funkce read() také umožňuje přidat jeden nepovinný parametr - velikost (v bytech) načtených dat. Můžete tedy zpracovávat soubor postupně:

size = 1024
data = soubor.read(size)
while data:
    # pracuj s proměnnou data
    ...
    data = soubor.read(size) # načti další kusanec

A nebo si na začátku určit maximální velikost dat a vyhodit výjimku, pokud je soubor větší.

max_size = 1024
data = soubor.read(max_size)

if soubor.read(1): # zkus načíst ještě malý kousek
    raise Exception("Tenhle soubor je nějak velký, kašlu na to")

Poznámka

V tomto příkladě jsme si ukázali vyhození vlastní výjimky pomocí klíčového slova raise