Práca so súbormi

F1420 Python

Otváranie súborov

Načítanie súborov do reťazca:

f = open('my_file.txt')
content = f.read()
f.close()

# do something with content...

content je typu str.

Často nájdete skrátený (a lepší) zápis:

with open('my_file.txt') as f:
    content = f.read()

# do something with content...

with je kľúčové slovo pre tzv. context manager, ktorý si “uprace po sebe”, a to aj v prípade, keď načítávanie zlyhá.

Čo je v premennej f?

Premenná f reprezentuje súbor, ktorý je na disku.

Okrem metódy read() je možné cez tento objekt iterovať (ale len raz!!):

i = 0
with open('my_file.txt') as f:
    for line in f:
        i += 1
        print(i, ': ', line)

    for line2 in f:
        print(line2) # no output

Zápis do súboru

Read Write
content = f.read() f.write(content)
open('my_file.txt') open('my_file.txt', 'w')

POZOR: Pokial súbor už existuje tak ho prepíšete:

with open('hello.txt', 'w') as f: 
    f.write('Hello world!')

Módy open

Reťazec 'w' v zápise znamená write

Character Meaning
‘r’ open for reading (default)
‘w’ open for writing
‘x’ open for exclusive creation, failing if the file already exists
‘a’ open for writing, appending to the end of the file if it exists

…takže, ak si nechcete prepísať existujúci súbor, tak použite 'x'

Špeciálne znaky

Znak v reťazci Poznámka
‘\n’ nový riadok
‘\r\n’ nový riadok na Windowse
‘\r’ návrat vozíku (nerobím si srandu)
‘\\’ vytvorí jednoduché opačné lomítko

Viac o nových riadkoch napr. tu.

Pokial chcete otvoriť súbor v inom adresari, použite absolútnu alebo relatívnu cestu:

with open('../ina_zlozka/dalsia_zlozka/subor.txt'):
    ...

Pozor

Lomítka na Windows sú opačne.

with open('C:\\Users\\Documents\\subor.txt'):
    ...

Cvičenie

1

Pracujte najlepšie v novej (prázdnej) zložke.

  • Pomocou Pythonu vytvorte súbor názvom “ahoj.txt”, v ktorom bude text “Ahoj!”
  • Otvorte súbor vo vašom obľúbenom textovom editore a modifikujte jeho obsah.
  • Načítajte súbor a vypíšte si jeho obsah.

Riešenie 1

with open('ahoj.txt', 'w') as subor:
    subor.write("Ahoj!") 
with open('ahoj.txt') as subor_mod:
    print(subor_mod.read())
    ## alebo
    # for i in subor_mod:
    #    print(i) 

2

  • Vytorte si súbor f_1, v ktorom bude text “1”.
  • Pomocou for-cyklu (alebo while) napíšte program, ktorý počíta faktoriál a zapisuje výsledky do súborov. Pritom použite vždy výsledok, ktorý načítate z predchádzajúceho súboru.
  • Vytvorte takto 10 suborov.

To znamená, že v súbore f_3 bude 6, v súbore f_5 bude 120, atd.

Riešenie 2

# ked f_1 existuje...
for i in range(1, 11):
    with open('f_' + str(i)) as f:
        prev = int(f.read())

    with open('f_' + str(i+1), 'w') as f:
        factorial = (i + 1) * prev
        f.write(str(factorial))

Typy súborov

  • Textové - tie, ktoré dokážete editovať (.txt, .py, .ipynb, …)
  • Binárne (.jpg, .docx,…)

V tomto predmete budete otvárať Pythonom len textové súbory, ale pracovať s binárnymi je tiež možné.

Práca s datovými súbormi

Spracovanie dát

Štandartne chcete:

  1. Načítať súbor do reťazca.
  2. Premeniť reťazec na zmysluplné datové štruktúry (zoznam, slovník), (ang. parsing).
  3. Vypočítať, zistiť niečo.
  4. Uložiť výsledok.

Ukážeme si nástroje, pre krok 2.

Metódy str: strip a split

Subor cornetto_trilogy.dat:

---IMDB.com reviews---
Shaun of the Dead, 7.9
Hot Fuzz, 7.8
The World's End, 7.0
     
with open('cornetto_trilogy.dat') as f:
    data = f.read()

# odstrani prip. prazdne riadky na zaciatku a na konci retazca
data = data.strip()

# rozdelenie po riadkoch
lines = data.splitlines()

# prvy  riadok nas nezaujima
lines = lines[1:]

names = []
scores = []
for l in lines:
    pair = l.split(',')
    names.append(pair[0])
    scores.append(float(pair[1].strip()))

Ostatné, ktoré sa hodia

split bez argumentu:

"1    2 3\n4\n 5".split() # rozdeli na prazdnych (whitespace) miestach

replace

"1, 2; 3 | 4".replace(',', ' ').replace(';', ' ').replace('|', ' ').split()

Viac o reťazcoch nájdete v dokumentácii.

Balíčky

“In the name of God, stop a moment, cease your work, look around you.” ― Leo Tolstoy

Pre väčšinu štruktúrovaných súborov, s ktorými sa stretnete už existuje parser.

  • CSV (Comma-Separated Values) balíček: csv, funkcia z pandas, read_csv
  • Tabuľkované súbory: numpy.genfromtxt, pandas.read_table
  • Excelovská tabuľka: pandas.read_excel

Komplexná práca so súbormi

  • os.path - práca s cestami a zložkami
  • shutil a os - mazanie súborov, kopírovanie, atď
  • glob - veľmi užitočné pokial máte viac súborov a chcete ich roztriediť podľa názvu.
  • pathlib - skoro vsetko nad