Soubory

Dnes se podíváme na to, jak v Pythonu číst z (a pak i zapisovat do) souborů.

Ke čtení textu ze souboru jsou potřeba tři kroky:

  • soubor otevřít,
  • něco z něj přečíst
  • a pak jej zase zavřít.

Vytvoř si v editoru soubor basnicka.txt a napiš do něj libovolnou básničku. Soubor ulož.

Na uložení souboru s básničkou doporučuji použít stejný editor, jaký používáš na Pythonní programy.

Používáš-li jiný editor než Atom, dej si při ukládání pozor na kódování:

  • Nabízí-li ti editor při ukládání výběr kódování, vyber UTF-8.
  • Je-li k dispozici kódování „UTF-8 bez BOM”, použij to.
  • Pokud musíš použít Notepad, který výše uvedené možnosti nemá, pak v kódu níže použij místo 'utf-8' nestandardní 'utf-8-sig'.

Ono utf-8 je název standardního kódování. Zajišťuje, že se případné emoji nebo znaky s diakritikou do souboru uloží tak, aby se daly přečíst i na jiném počítači či operačním systému. 🎉

Potom napiš tento program:

soubor = open('basnicka.txt', encoding='utf-8')
obsah = soubor.read()
print(obsah)
soubor.close()

a spusť ho z adresáře, ve kterém je basnicka.txt (jinými slovy, aktuální adresář musí být ten, který obsahuje soubor s básničkou).

Obsah souboru se vypíše!

Co se tu děje? Tak jako int() vrací čísla a input() řetězce, funkce open() vrací hodnotu, která představuje otevřený soubor. Tahle hodnota má vlastní metody. Tady používáme metodu read(), která najednou přečte celý obsah souboru a vrátí ho jako řetězec. Na metodu close(), která otevřený soubor zavírá, se podíváme později.

Iterace nad soubory

Otevřené soubory se, jako např. řetězce či range, dají použít s příkazem for. Tak jako for i in range poskytuje za sebou jdoucí čísla a for c in 'abcd' poskytuje jednotlivé znaky řetězce, for radek in soubor bude do proměnné radek dávat jednotlivé řádky čtené ze souboru.

Například můžeme básničku odsadit, aby se vyjímala v textu:

print('Slyšela jsem tuto básničku:')
print()
soubor = open('basnicka.txt', encoding='utf-8')
for radek in soubor:
    print('    ' + radek)
soubor.close()
print()
print('Jak se ti líbí?')

Když to zkusíš, zjistíš, že trochu nesedí řádkování. Zkusíš vysvětlit, proč tomu tak je?

Řešení

Zavírání souborů

Je docela důležité soubor potom, co s ním přestaneš pracovat, zavřít (pomocí metody close()). Operační systémy mají limity na počet současně otevřených souborů, které se nezavíráním dají snadno překročit. Na Windows navíc nemůžeš soubor, který je stále otevřený, otevřít znovu.

Soubory se dají přirovnat k ledničce: abychom něco mohly z ledničky vzít, nebo dát dovnitř, musíme ji předtím otevřít a potom zavřít. Bez zavření to sice na první pohled funguje taky, ale pravděpodobně potom brzo něco zplesniví.

Zapomenout zavřít soubor je docela jednoduché: například pokud by v rámci zpracování souboru nastala výjimka nebo kdybys vyskočila z funkce pomocí return, náš předchozí kód by close nezavolal, a soubor by zůstal otevřený.

K tomu, abychom soubor nezapomněly v podobných příkazech zavřít, slouží příkaz try/finally, který jsme si ukázaly v souvislosti s výjimkami.

Pro připomenutí, finally se provede vždycky – i když blok try skončí normálně, i když v něm nastane výjimka, i když z něj „vyskočíš” pomocí return či break.

def iniciala():
    """Vrátí první písmeno v daném souboru."""

    soubor = open('basnicka.txt', encoding='utf-8')
    try:
        obsah = soubor.read()
        return obsah[0]
    finally:
        soubor.close()

print(iniciala())

Blok finally se takhle dá použít vždycky, když je potřeba něco ukončit nebo zavřít – ať už je to soubor, nebo třeba připojení k databázi.

Příkaz with

Protože je try/finally celkem dlouhé a nepohodlné, má Python i příjemnější variantu, příkaz with:

def iniciala():
    """Vrátí první písmeno v daném souboru."""

    with open('basnicka.txt', encoding='utf-8') as soubor:
        obsah = soubor.read()
        return obsah[0]

print(iniciala())

Tenhle příkaz jsme už viděly u testování, kde uvozoval blok, ve kterém má nastat výjimka – potom, co blok skončí, se zkontroluje, jestli nastala a jestli je toho správného typu. V našem případě se po skončení bloku zavře soubor, ať už výjimka nastala nebo ne. Podobně jako s finally se zavře vždycky – ať už blok with skončil normálně, výjimkou, nebo, jako tady, „vyskočením” ven.

V naprosté většině případů je pro práci se soubory nejlepší použít with.

Psaní souborů

Pozor!

Pro Python není problém smazat obsah jakéhokoli souboru. Psaní do souborů si zkoušej v adresáři, ve kterém nemáš uložené důležité informace!

Soubory se v Pythonu dají i zapisovat. Pro zápis se soubor otevře pomocí pojmenovaného argumentu mode='w' (z angl. mode, mód a write, psát). Zapisovat jednotlivé řetězce se pak dá metodou write.

Pokud soubor už existuje, otevřením s mode='w' se veškerý jeho obsah smaže. Po zavření tak v souboru bude jen to, co do něj ve svém programu zapíšeš.

with open('druha-basnicka.txt', mode='w', encoding='utf-8') as soubor:
    soubor.write('Naše staré hodiny\n')
    soubor.write('Bijí čtyři hodiny\n')

Proč to \n?

Metoda write neodřádkovává automaticky. Chceš-li do souboru zapsat více řádků, je potřeba každý z nich ukončit „ručně“, speciálním znakem '\n' který jsme si popsaly v sekci o řetězcích.

Případně se dá použít funkce print, která kromě do terminálu umí vypisovat i do otevřeného souboru, a to pomocí pojmenovaného argumentu file. Ostatní možnosti funkce print – automatické odřádkování, převádnění na řetězce, možnost vypsat víc hodnot najednou apod. – samozřejmě zůstávají.

with open('druha-basnicka.txt', mode='w', encoding='utf-8') as soubor:
    print('Naše staré hodiny', file=soubor)
    print('Bijí', 2+2, 'hodiny', file=soubor)
{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2018/pyladies-praha-podzim-cznic:exercises:1",
      "title": "Soubory",
      "html": "\n          \n    \n\n    <h1>Soubory</h1>\n<p>Dnes se pod&#xED;v&#xE1;me na to, jak v Pythonu &#x10D;&#xED;st z\n(a pak i zapisovat do) soubor&#x16F;.</p>\n<p>Ke &#x10D;ten&#xED; textu ze souboru jsou pot&#x159;eba t&#x159;i kroky:</p>\n<ul>\n<li>soubor <em>otev&#x159;&#xED;t</em>,</li>\n<li>n&#x11B;co z n&#x11B;j <em>p&#x159;e&#x10D;&#xED;st</em></li>\n<li>a pak jej zase <em>zav&#x159;&#xED;t</em>.</li>\n</ul>\n<p>Vytvo&#x159; si v&#xA0;editoru soubor <code>basnicka.txt</code> a napi&#x161; do n&#x11B;j libovolnou b&#xE1;sni&#x10D;ku.\nSoubor ulo&#x17E;.</p>\n<div class=\"admonition note\"><p>Na ulo&#x17E;en&#xED; souboru s b&#xE1;sni&#x10D;kou doporu&#x10D;uji pou&#x17E;&#xED;t\nstejn&#xFD; editor, jak&#xFD; pou&#x17E;&#xED;v&#xE1;&#x161; na Pythonn&#xED; programy.</p>\n<p>Pou&#x17E;&#xED;v&#xE1;&#x161;-li jin&#xFD; editor ne&#x17E; Atom, dej si p&#x159;i ukl&#xE1;d&#xE1;n&#xED; pozor na k&#xF3;dov&#xE1;n&#xED;:</p>\n<ul>\n<li>Nab&#xED;z&#xED;-li ti editor p&#x159;i ukl&#xE1;d&#xE1;n&#xED; v&#xFD;b&#x11B;r k&#xF3;dov&#xE1;n&#xED;, vyber UTF-8.</li>\n<li>Je-li k dispozici k&#xF3;dov&#xE1;n&#xED; &#x201E;UTF-8 bez BOM&#x201D;, pou&#x17E;ij to.</li>\n<li>Pokud mus&#xED;&#x161; pou&#x17E;&#xED;t Notepad, kter&#xFD; v&#xFD;&#x161;e uveden&#xE9; mo&#x17E;nosti nem&#xE1;, pak v&#xA0;k&#xF3;du\nn&#xED;&#x17E;e pou&#x17E;ij m&#xED;sto <code>&apos;utf-8&apos;</code> nestandardn&#xED; <code>&apos;utf-8-sig&apos;</code>.</li>\n</ul>\n<p>Ono <a href=\"https://en.wikipedia.org/wiki/UTF-8\"><code>utf-8</code></a> je n&#xE1;zev standardn&#xED;ho k&#xF3;dov&#xE1;n&#xED;.\nZaji&#x161;&#x165;uje, &#x17E;e se p&#x159;&#xED;padn&#xE9; emoji nebo znaky s&#xA0;diakritikou do souboru ulo&#x17E;&#xED;\ntak, aby se daly p&#x159;e&#x10D;&#xED;st i na jin&#xE9;m po&#x10D;&#xED;ta&#x10D;i &#x10D;i opera&#x10D;n&#xED;m syst&#xE9;mu.\n&#x1F389;</p>\n</div><p>Potom napi&#x161; tento program:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"n\">soubor</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&apos;basnicka.txt&apos;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&apos;utf-8&apos;</span><span class=\"p\">)</span>\n<span class=\"n\">obsah</span> <span class=\"o\">=</span> <span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">obsah</span><span class=\"p\">)</span>\n<span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n</pre></div><p>a spus&#x165; ho z adres&#xE1;&#x159;e, ve kter&#xE9;m je\n<code>basnicka.txt</code> (jin&#xFD;mi slovy, aktu&#xE1;ln&#xED; adres&#xE1;&#x159; mus&#xED; b&#xFD;t ten, kter&#xFD;\nobsahuje soubor s&#xA0;b&#xE1;sni&#x10D;kou).</p>\n<p>Obsah souboru se vyp&#xED;&#x161;e!</p>\n<p>Co se tu d&#x11B;je?\nTak jako <code>int()</code> vrac&#xED; &#x10D;&#xED;sla a <code>input()</code> &#x159;et&#x11B;zce, funkce\n<code>open()</code> vrac&#xED; hodnotu, kter&#xE1; p&#x159;edstavuje <em>otev&#x159;en&#xFD; soubor</em>.\nTahle hodnota m&#xE1; vlastn&#xED; metody.\nTady pou&#x17E;&#xED;v&#xE1;me metodu <code>read()</code>, kter&#xE1;\nnajednou p&#x159;e&#x10D;te cel&#xFD; obsah souboru a vr&#xE1;t&#xED; ho jako &#x159;et&#x11B;zec.\nNa metodu <code>close()</code>, kter&#xE1; otev&#x159;en&#xFD; soubor zav&#xED;r&#xE1;, se pod&#xED;v&#xE1;me pozd&#x11B;ji.</p>\n<h2>Iterace nad soubory</h2>\n<p>Otev&#x159;en&#xE9; soubory se, jako nap&#x159;. &#x159;et&#x11B;zce &#x10D;i <code>range</code>,\ndaj&#xED; pou&#x17E;&#xED;t s p&#x159;&#xED;kazem <code>for</code>.\nTak jako <code>for i in range</code> poskytuje za sebou jdouc&#xED; &#x10D;&#xED;sla a <code>for c in &apos;abcd&apos;</code>\nposkytuje jednotliv&#xE9; znaky &#x159;et&#x11B;zce, <code>for radek in soubor</code> bude do prom&#x11B;nn&#xE9;\n<code>radek</code> d&#xE1;vat jednotliv&#xE9; &#x159;&#xE1;dky &#x10D;ten&#xE9; ze souboru.</p>\n<p>Nap&#x159;&#xED;klad m&#x16F;&#x17E;eme b&#xE1;sni&#x10D;ku odsadit,\naby se vyj&#xED;mala v textu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Sly&#x161;ela jsem tuto b&#xE1;sni&#x10D;ku:&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">()</span>\n<span class=\"n\">soubor</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&apos;basnicka.txt&apos;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&apos;utf-8&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">for</span> <span class=\"n\">radek</span> <span class=\"ow\">in</span> <span class=\"n\">soubor</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;    &apos;</span> <span class=\"o\">+</span> <span class=\"n\">radek</span><span class=\"p\">)</span>\n<span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">()</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Jak se ti l&#xED;b&#xED;?&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Kdy&#x17E; to zkus&#xED;&#x161;, zjist&#xED;&#x161;, &#x17E;e trochu nesed&#xED;\n&#x159;&#xE1;dkov&#xE1;n&#xED;. Zkus&#xED;&#x161; vysv&#x11B;tlit, pro&#x10D; tomu tak je?</p>\n<div class=\"solution\" id=\"solution-0\">\n    <h3>&#x158;e&#x161;en&#xED;</h3>\n    <div class=\"solution-cover\">\n        <a href=\"/2018/pyladies-praha-podzim-cznic/beginners/files/index/solutions/0/\"><span class=\"link-text\">Uk&#xE1;zat &#x159;e&#x161;en&#xED;</span></a>\n    </div>\n    <div class=\"solution-body\" aria-hidden=\"true\">\n        <p>Ka&#x17E;d&#xFD; &#x159;&#xE1;dek kon&#x10D;&#xED; znakem nov&#xE9;ho &#x159;&#xE1;dku (<code>&apos;\\n&apos;</code>).\nP&#x159;i proch&#xE1;zen&#xED; souboru Python tento znak nech&#xE1;v&#xE1; na konci &#x159;et&#x11B;zce\n<code>radek</code> &#xB9;.\nFunkce <code>print</code> pak p&#x159;id&#xE1; dal&#x161;&#xED; nov&#xFD; &#x159;&#xE1;dek, proto&#x17E;e ta na konci\nv&#xFD;pisu v&#x17E;dycky od&#x159;&#xE1;dkov&#xE1;v&#xE1; &#x2013; pokud nedostane argument <code>end=&apos;&apos;</code>.\nTo je jeden zp&#x16F;sob jak &#x159;&#xE1;dkov&#xE1;n&#xED; &#x201E;spravit&#x201C;; dal&#x161;&#xED; je pou&#x17E;&#xED;t na ka&#x17E;d&#xFD; &#x159;&#xE1;dek\nmetodu <code>rstrip</code>, kter&#xE1; odstran&#xED; mezery a nov&#xE9; &#x159;&#xE1;dky z konce &#x159;et&#x11B;zce.</p>\n<hr>\n<p>&#xB9; Pro&#x10D; to d&#x11B;l&#xE1;? Kdyby <code>&apos;\\n&apos;</code> na konci &#x159;&#xE1;dk&#x16F; nebylo,\nnedalo by se nap&#x159;. dob&#x159;e rozli&#x161;it, jestli posledn&#xED; &#x159;&#xE1;dek\nkon&#x10D;&#xED; na <code>&apos;\\n&apos;</code></p>\n    </div>\n</div><h2>Zav&#xED;r&#xE1;n&#xED; soubor&#x16F;</h2>\n<p>Je docela d&#x16F;le&#x17E;it&#xE9; soubor potom, co s&#xA0;n&#xED;m\np&#x159;estane&#x161; pracovat, zav&#x159;&#xED;t (pomoc&#xED; metody <code>close()</code>).\nOpera&#x10D;n&#xED; syst&#xE9;my maj&#xED; limity na po&#x10D;et\nsou&#x10D;asn&#x11B; otev&#x159;en&#xFD;ch soubor&#x16F;, kter&#xE9; se nezav&#xED;r&#xE1;n&#xED;m\ndaj&#xED; snadno p&#x159;ekro&#x10D;it.\nNa Windows nav&#xED;c nem&#x16F;&#x17E;e&#x161; soubor, kter&#xFD; je st&#xE1;le\notev&#x159;en&#xFD;, otev&#x159;&#xED;t znovu.</p>\n<p>Soubory se daj&#xED; p&#x159;irovnat k ledni&#x10D;ce: abychom n&#x11B;co\nmohly z ledni&#x10D;ky vz&#xED;t, nebo d&#xE1;t dovnit&#x159;, mus&#xED;me\nji p&#x159;edt&#xED;m otev&#x159;&#xED;t a potom zav&#x159;&#xED;t.\nBez zav&#x159;en&#xED; to sice na prvn&#xED; pohled funguje taky,\nale pravd&#x11B;podobn&#x11B; potom brzo n&#x11B;co zplesniv&#xED;.</p>\n<p>Zapomenout zav&#x159;&#xED;t soubor je docela jednoduch&#xE9;:\nnap&#x159;&#xED;klad pokud by v r&#xE1;mci zpracov&#xE1;n&#xED; souboru\nnastala v&#xFD;jimka nebo kdybys vysko&#x10D;ila z funkce\npomoc&#xED; <code>return</code>, n&#xE1;&#x161; p&#x159;edchoz&#xED; k&#xF3;d by <code>close</code> nezavolal,\na soubor by z&#x16F;stal otev&#x159;en&#xFD;.</p>\n<p>K tomu, abychom soubor nezapomn&#x11B;ly v podobn&#xFD;ch\np&#x159;&#xED;kazech zav&#x159;&#xED;t, slou&#x17E;&#xED; p&#x159;&#xED;kaz\n<code>try/finally</code>, kter&#xFD; jsme si uk&#xE1;zaly v&#xA0;souvislosti\ns&#xA0;v&#xFD;jimkami.</p>\n<p>Pro p&#x159;ipomenut&#xED;, <code>finally</code> se provede v&#x17E;dycky &#x2013; i kdy&#x17E; blok <code>try</code> skon&#x10D;&#xED;\nnorm&#xE1;ln&#x11B;, i kdy&#x17E; v n&#x11B;m nastane v&#xFD;jimka, i kdy&#x17E; z n&#x11B;j\n&#x201E;vysko&#x10D;&#xED;&#x161;&#x201D; pomoc&#xED; <code>return</code> &#x10D;i <code>break</code>.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">iniciala</span><span class=\"p\">():</span>\n    <span class=\"sd\">&quot;&quot;&quot;Vr&#xE1;t&#xED; prvn&#xED; p&#xED;smeno v dan&#xE9;m souboru.&quot;&quot;&quot;</span>\n\n    <span class=\"n\">soubor</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&apos;basnicka.txt&apos;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&apos;utf-8&apos;</span><span class=\"p\">)</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">obsah</span> <span class=\"o\">=</span> <span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"n\">obsah</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">finally</span><span class=\"p\">:</span>\n        <span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">iniciala</span><span class=\"p\">())</span>\n</pre></div><p>Blok <code>finally</code> se takhle d&#xE1; pou&#x17E;&#xED;t v&#x17E;dycky,\nkdy&#x17E; je pot&#x159;eba n&#x11B;co ukon&#x10D;it nebo zav&#x159;&#xED;t &#x2013; a&#x165; u&#x17E;\nje to soubor, nebo t&#x159;eba p&#x159;ipojen&#xED; k datab&#xE1;zi.</p>\n<h2>P&#x159;&#xED;kaz with</h2>\n<p>Proto&#x17E;e je <code>try/finally</code> celkem dlouh&#xE9; a nepohodln&#xE9;, m&#xE1; Python i p&#x159;&#xED;jemn&#x11B;j&#x161;&#xED;\nvariantu, p&#x159;&#xED;kaz <code>with</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">iniciala</span><span class=\"p\">():</span>\n    <span class=\"sd\">&quot;&quot;&quot;Vr&#xE1;t&#xED; prvn&#xED; p&#xED;smeno v dan&#xE9;m souboru.&quot;&quot;&quot;</span>\n\n    <span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&apos;basnicka.txt&apos;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&apos;utf-8&apos;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">soubor</span><span class=\"p\">:</span>\n        <span class=\"n\">obsah</span> <span class=\"o\">=</span> <span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"n\">obsah</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">iniciala</span><span class=\"p\">())</span>\n</pre></div><p>Tenhle p&#x159;&#xED;kaz jsme u&#x17E; vid&#x11B;ly u testov&#xE1;n&#xED;,\nkde uvozoval blok, ve kter&#xE9;m m&#xE1; nastat v&#xFD;jimka &#x2013;\npotom, co blok skon&#x10D;&#xED;, se zkontroluje, jestli\nnastala a jestli je toho spr&#xE1;vn&#xE9;ho typu.\nV na&#x161;em p&#x159;&#xED;pad&#x11B; se po skon&#x10D;en&#xED; bloku\nzav&#x159;e soubor, a&#x165; u&#x17E; v&#xFD;jimka nastala nebo ne.\nPodobn&#x11B; jako s&#xA0;<code>finally</code> se zav&#x159;e v&#x17E;dycky\n&#x2013; a&#x165; u&#x17E; blok <code>with</code> skon&#x10D;il norm&#xE1;ln&#x11B;,\nv&#xFD;jimkou, nebo, jako tady, &#x201E;vysko&#x10D;en&#xED;m&#x201D; ven.</p>\n<p>V naprost&#xE9; v&#x11B;t&#x161;in&#x11B; p&#x159;&#xED;pad&#x16F; je pro pr&#xE1;ci se soubory\nnejlep&#x161;&#xED; pou&#x17E;&#xED;t <code>with</code>.</p>\n<h2>Psan&#xED; soubor&#x16F;</h2>\n<div class=\"admonition warning\"><p class=\"admonition-title\">Pozor!</p>\n<p>Pro Python nen&#xED; probl&#xE9;m smazat obsah jak&#xE9;hokoli souboru.\nPsan&#xED; do soubor&#x16F; si zkou&#x161;ej v&#xA0;adres&#xE1;&#x159;i, ve kter&#xE9;m nem&#xE1;&#x161; ulo&#x17E;en&#xE9;\nd&#x16F;le&#x17E;it&#xE9; informace!</p>\n</div><p>Soubory se v&#xA0;Pythonu daj&#xED; i zapisovat.\nPro z&#xE1;pis se soubor otev&#x159;e pomoc&#xED; pojmenovan&#xE9;ho\nargumentu <code>mode=&apos;w&apos;</code> (z angl.\n<em>mode</em>, m&#xF3;d a <em>write</em>, ps&#xE1;t).\nZapisovat jednotliv&#xE9; &#x159;et&#x11B;zce se pak d&#xE1; metodou\n<code>write</code>.</p>\n<p>Pokud soubor u&#x17E; existuje, otev&#x159;en&#xED;m s&#xA0;<code>mode=&apos;w&apos;</code> se ve&#x161;ker&#xFD; jeho obsah sma&#x17E;e.\nPo zav&#x159;en&#xED; tak v&#xA0;souboru bude jen to, co do n&#x11B;j ve sv&#xE9;m programu zap&#xED;&#x161;e&#x161;.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&apos;druha-basnicka.txt&apos;</span><span class=\"p\">,</span> <span class=\"n\">mode</span><span class=\"o\">=</span><span class=\"s1\">&apos;w&apos;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&apos;utf-8&apos;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">soubor</span><span class=\"p\">:</span>\n    <span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"s1\">&apos;Na&#x161;e star&#xE9; hodiny</span><span class=\"se\">\\n</span><span class=\"s1\">&apos;</span><span class=\"p\">)</span>\n    <span class=\"n\">soubor</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"s1\">&apos;Bij&#xED; &#x10D;ty&#x159;i hodiny</span><span class=\"se\">\\n</span><span class=\"s1\">&apos;</span><span class=\"p\">)</span>\n</pre></div><div class=\"admonition note\"><p class=\"admonition-title\">Pro&#x10D; to \\n?</p>\n<p>Metoda <code>write</code> neod&#x159;&#xE1;dkov&#xE1;v&#xE1; automaticky.\nChce&#x161;-li do souboru zapsat v&#xED;ce &#x159;&#xE1;dk&#x16F;, je pot&#x159;eba ka&#x17E;d&#xFD; z&#xA0;nich ukon&#x10D;it\n&#x201E;ru&#x10D;n&#x11B;&#x201C;, speci&#xE1;ln&#xED;m znakem <code>&apos;\\n&apos;</code> kter&#xFD; jsme si popsaly\nv&#xA0;<a href=\"/2018/pyladies-praha-podzim-cznic/beginners/str/\">sekci o &#x159;et&#x11B;zc&#xED;ch</a>.</p>\n</div><p>P&#x159;&#xED;padn&#x11B; se d&#xE1; pou&#x17E;&#xED;t funkce <code>print</code>,\nkter&#xE1; krom&#x11B; do termin&#xE1;lu um&#xED; vypisovat i do otev&#x159;en&#xE9;ho souboru,\na to pomoc&#xED; pojmenovan&#xE9;ho argumentu <code>file</code>.\nOstatn&#xED; mo&#x17E;nosti funkce <code>print</code> &#x2013; automatick&#xE9; od&#x159;&#xE1;dkov&#xE1;n&#xED;,\np&#x159;ev&#xE1;dn&#x11B;n&#xED; na &#x159;et&#x11B;zce, mo&#x17E;nost vypsat v&#xED;c\nhodnot najednou apod. &#x2013; samoz&#x159;ejm&#x11B; z&#x16F;st&#xE1;vaj&#xED;.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&apos;druha-basnicka.txt&apos;</span><span class=\"p\">,</span> <span class=\"n\">mode</span><span class=\"o\">=</span><span class=\"s1\">&apos;w&apos;</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&apos;utf-8&apos;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">soubor</span><span class=\"p\">:</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Na&#x161;e star&#xE9; hodiny&apos;</span><span class=\"p\">,</span> <span class=\"nb\">file</span><span class=\"o\">=</span><span class=\"n\">soubor</span><span class=\"p\">)</span>\n    <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"s1\">&apos;Bij&#xED;&apos;</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"o\">+</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">&apos;hodiny&apos;</span><span class=\"p\">,</span> <span class=\"nb\">file</span><span class=\"o\">=</span><span class=\"n\">soubor</span><span class=\"p\">)</span>\n</pre></div>\n\n\n        "
    }
  }
}