Soubory. Úvod. Adresáře a cesty. Adresáře. Aktuální pracovní adresář. Petr Pošík. Katedra kybernetiky, FEL ČVUT v Praze

Podobné dokumenty
files November 20, 2018

Automatické testování softwaru. Testujte svůj kód! Předpoklady: Příklad: sum_digits() Možnost 1: Zkusíme funkci použít v konzoli Pythonu.

VISUAL BASIC. Práce se soubory

Programování v Pythonu

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

Programování v Pythonu

Systém souborů (file system, FS)

POČÍTAČE A PROGRAMOVÁNÍ

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Úvod do programování 8. hodina

Zadání: TÉMA: Zápis algoritmu, čtení textového souboru, porovnání řetězců.

Datové typy a struktury

Konečný automat. Jan Kybic.

IB111 Úvod do programování skrze Python Přednáška 7

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Práce se soubory. Základy programování 2 Tomáš Kühr

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Informatika / o souborech

PHP a Large Objecty v PostgreSQL

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Popis rozšířujících funkcí JScriptu

Soubory. Hung Hoang Dieu. Department of Mathematics Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague 1 / 7

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové soubory

Textové soubory. alg9 1

Archiv elektronických dokumentů Zela

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Textové soubory

PHP tutoriál (základy PHP snadno a rychle)

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Textové popisky. Typ dat

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Programovací jazyk Pascal

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Ošetřování chyb v programech

Velmi stručný návod jak dostat data z Terminálu Bloomberg do R

Základy PERLu snadno a rychle

Python profesionálně: dynamické parametry, generátory, lambda funkce... with. Dynamické parametry

Algoritmus. Algoritmus je posloupnost kroků, které jsou potřeba k vyřešení problému.

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Soubor jako posloupnost bytů

Základy programování (IZP)

Natural Language Toolkit

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. November 16, 2017

Django Urls, views, templates

Úloha 3 editor a skripty. připojte se vzdáleně na dray6.feld.cvut.cz heslo získáte na adrese

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Pro označení disku se používají písmena velké abecedy, za nimiž následuje dvojtečka.

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Programování v Pythonu

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

Vestavěné nástroje Pythonu

IB111 Základy programování Radek Pelánek

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML

Základy XML struktura dokumentu (včetně testových otázek)

Visual Basic for Application

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

Příklad: Součet náhodných čísel ve vektoru s počtem prvků, které zadá uživatel, pomocí sum() a pomocí cyklu for. Ověříme, že příliš výpisů na

Počítač jako elektronické, Číslicové zařízení

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Programování ve Windows Dynamické knihovny. Andrea Číková Martin Osovský

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Minebot manuál (v 1.2)


PROGRAMOVÁNÍ V SHELLU

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ

Tabulkový procesor. Základní rysy

Princip funkce počítače

Algoritmizace a programování

Windows - základy. Hlavním vypínačem na základní jednotce. K datům uloženým do výchozí složky.

10 Algoritmizace Příklad 2 Word 2007/ VBA

Basic256 - úvod do programování Příklady. ing. petr polách

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

ADDRESS BOOK VÍTEJTE V NÁVODU K ADRESÁŘI TALK FUSION

PŘÍKAZY PRÁCE SE SOUBORY

Windows 10 (5. třída)

Základy programování (IZP)

Implementace LL(1) překladů

Poslední aktualizace: 14. října 2011

MIDAM Simulátor Verze 1.5

Systém souborů Mgr. Josef Horálek

DUM 06 téma: Tvorba makra pomocí VBA

Operační systémy. Cvičení 3: Programování v C pod Unixem

Základy programování (IZP)

Maturitní téma: Operační MS-DOS

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Úvod do Unixu. man: příkaz pro zobrazení nápovědy k danému příkazu, programu (pokud je k dispozici), např. man cp. pwd: vypíše cestu k aktuální pozici

Transkript:

Soubory Petr Pošík Katedra kybernetiky, FEL ČVUT v Praze OI, B4B99RPH: Řešení problémů a hry, 2016 Prerekvizity: Cykly Úvod Informace jsou na počítači uloženy v pojmenovaných "balících", kterým se říká soubory. Naučíme se, jak se ze souborů informace čtou a jak se do nich zapisují. Soubory jsou na disku uloženy v souborovém systému, který je hierarchicky členěn pomocí adresářů (directories) neboli složek (folders). Nejprve si ukážeme základy práce s nimi. Adresáře a cesty Adresáře Adresář (složka) je organizační jednotka souborového systému, která nám umožňuje informace na disku hierarchicky členit. Může obsahovat soubory nebo další adresáře. Každý adresář je sám součástí jiného adresáře (s výjimkou adresáře kořenového). Kořenový adresář je zvláštní. Je vždy v souborovém systému přítomen a představuje počátek hierarchické struktury. Obvykle se označuje dopředným lomítkem (/). Windows mají zvláštní kořenový adresář na každém disku a označují se zpětným lomítkem (\). Každý adresář obsahuje 2 zvláštní položky:. je odkaz na adresář samotný.. je odkaz na nadřazený adresář Aktuální pracovní adresář Aktuální pracovní adresář (current working directory, CWD) je z hlediska Pythonu obvykle ten adresář, odkud jste spustili interpret Pythonu, nikoliv adresář, kde je interpret Pythonu uložen (na některých platformách to může být jinak). Jaký je váš aktuální pracovní adresář můžete zjistit pomocí funkce getcwd z modulu os. Podívejme se, jaký je aktuální pracovní adresář právě nyní:

In [1]: import os print(os.getcwd()) C:\P\0Teaching\rph\repos\rph lectures\files Cesty Cesty (https://en.wikipedia.org/wiki/path_%28computing%29) jsou sekvence názvů adresářů (někdy zakončené názvem souboru), které jednoznačně určují soubor nebo adresář v souborovém systému. Absolutní cesty vždy začínají kořenovým adresářem (/, forward slash), na Windows často i písmenem označujícím disk (C:\\). Příklad: /home/posik/teaching/rph/lectures/files.pdf Relativní cesty se vždy konstruují od aktuálního pracovního adresáře. Předpokládejme, že CWD je /home/posik/teaching. Pak relativní cesty prg/lectures/files.pdf../../svoboda/presentations/upload_system.pdf označují soubory /home/posik/teaching/prg/lectures/files.pdf /home/svoboda/presentations/upload_system.pdf Pohyb v souborovém systému aneb změna aktuálního pracovního adresáře: na příkazové řádce OS byste použili příkazy cd nebo chdir. V Pythonu můžete použít funkci os.chdir(): In [2]: import os orig_wd = os.getcwd() os.chdir('/p/0teaching') print(os.getcwd()) C:\P\0Teaching Nyní jsme v jiném pracovním adresáři. A můžeme jej změnit zpět: In [3]: os.chdir(orig_wd) print(os.getcwd()) C:\P\0Teaching\rph\repos\rph lectures\files

Práce s cestami Modul os.path obsahuje funkce pro práci se souborovými cestami: In [4]: fpath = os.path.abspath('files.pdf') print(fpath) C:\P\0Teaching\rph\repos\rph lectures\files\files.pdf In [5]: print(os.path.dirname(fpath)) C:\P\0Teaching\rph\repos\rph lectures\files In [6]: print(os.path.basename(fpath)) files.pdf In [7]: print(os.path.splitext(os.path.basename(fpath))) ('files', '.pdf') Jak správně vytvořit cestu z jednotlivých fragmentů? In [8]: fpath2 = os.path.join('\\', 'P', 'Teaching') print(fpath2) \P\Teaching Jak získat cestu k adresáři nebo souboru relativní k aktuálnímu pracovnímu adresáři? In [9]: print(os.path.relpath(fpath2))..\..\..\..\..\teaching Soubory

Typy souborů Textové soubory: obsahují "čitelné" znaky dají se přečíst v téměř libovolném textovém editoru Binární soubory: hudební soubory, videa, dokumenty slovních procesorů (MS Word), prezentace, PDF,... obsahují různé řídicí informace specifické pro daný formát souboru k jejich přečtení/interpretaci potřebujeme zvláštní program, který jejich struktuře rozumí V dalším se budeme zabývat jen textovými soubory. Textové soubory Zabírají obvykle malé místo na disku (prázdný textový soubor je skutečně prázdný, tj. jeho velikost je 0). I přesto mohou mít jistou vnitřní strukturu: Zdrojové kódy Hodnoty oddělené čárkou (CSV) HTML soubory... Otevřít a zavřít Pokud se chcete podívat na obsah šuplíku, nebo pokud do něj něco chcete vložit, musíte šuplík nejprve otevřít. Když jste s prací hotovi, zase jej zavřete. Totéž platí pro soubory. Když šuplík otevřete, držíte jej za držadlo, pomocí něhož s šuplíkem manipulujete a pomocí něhož ho na konci zase zavřete. Držadlo souboru, file handle, vám umožní dělat s otevřeným souborem nejrůznější věci. Můžete soubor číst, přesunout se na nějakou pozici v souboru, atd. Příklad: čtení obsahu souboru Vytvořme jednoduchý textový soubor text.txt v aktuálním pracovním adresáři. (Na ukázku, abychom měli co načítat. Následující řádky ukazují způsob, jakým se dá vytvořit textový soubor v prostředí Jupyter. V Pythonu by to nefungovalo.) In [10]: %%writefile text.txt Hello, world! How are you? Overwriting text.txt Nyní můžeme onen soubor načíst pomocí Pythonu a zobrazit jeho obsah:

In [11]: file = open('text.txt', 'r') contents = file.read() file.close() print(contents) Hello, world! How are you? 1. První řádek instruuje Python (a operační systém), aby otevřel (open) soubor jménem text.txt (první argument) a vrátil "držadlo" tohoto otevřeného souboru. Druhý argument, 'r' (někdy nazýván mód souboru), indikuje, že soubor má být otevřen ke čtení. Existuje několik módů, v nichž může být soubor otevřen: pro čtení ('r'), zápis ('w'), přidávání ('a'). Mód souboru také specifikuje, zda jej chceme otevřít jako textový nebo jako binární ('wb', 'rb',...). 2. Na druhém řádku se na souboru zavolá metoda read(), čímž se načte celý obsah souboru do paměti ve formě dlouhého řetězce. Tento řetězec se pak přiřadí k proměnné contents. 3. Na třetím řádku soubor (pomocí držadla) zavíráme. 4. Na posledním řádku vytiskneme načtený obsah souboru. Kódování řetězců a textových souborů Řetězce jsou vlastně abstrakce. Ve skutečnosti jsou to jen sekvence bytů, ale tyto byty (a jejich skupiny) jsou interpretovány jako indexy do tabulky symbolů, která obsahuje velká a malá písmena, číslice, zvláštní znaky a mnoho dalších symbolů. Tato tabulka symbolů představuje kódování. Stejná sekvence bytů, která v jednom kódování představuje čitelný řetězec, může při použití jiného kódování vypadat jako naprosto nesmyslná změť znaků. ASCII: obsahuje 127 znaků, anglická velká a malá písmena, číslice a nějaké symboly. Žádné znaky z jiných národních abeced.... UTF 8: "Unicode" obsahující téměř jakýkoli znak jakékoli abecedy. Obsahuje ASCII jako svou podmnožinu. POUŽÍVEJTE TOTO KÓDOVÁNÍ, kdykoli vám to okolnosti umožní! To platí i pro textové soubory! Otevření souboru se specifikovaným kódováním Funkce open() má několik dalších parametrů; jedním z nich je encoding. Pokud explicitně použijete UTF 8 pokaždé, když otevíráte textový soubor, ušetříte si mnoho nepříjemností: nebo f = open('file_to_open.txt', 'r', encoding='utf 8') # Do something with f f.close() with open('file_to_open.txt', 'r', encoding='utf 8') as f: # Do something with f

Příkaz with Protože každé volání příkazu open() by mělo mít odpovídající volání metody close(), Python je vybaven příkazem with, který automaticky uzavře soubor na konci bloku příkazů. Kód f = open('text.txt', 'r', encoding='utf 8') contents = f.read() f.close() print(contents) je ekvivalentní následujícímu kódu s příkazem with: contents = f.read() print(contents) Čtení souboru: file.read() Použijte tuto techniku, pokud chcete všechen obsah souboru načíst do jediného (možná obrovského) řetězce, nebo pokud chcete určit, kolik znaků se má přečíst. In [12]: contents = f.read() print(contents) Hello, world! How are you? Když je metoda read() zavolána bez argumentů, načte celý zbytek souboru (od aktuální pozice v souboru). Když jí předáme celočíselný argument, načte specifikovaný počet znaků a posune aktuální pozici za načtený úsek. In [13]: first_10_chars = f.read(10) the_rest = f.read() print("the first 10 chars:", first_10_chars) print("the rest:", the_rest) The first 10 chars: Hello, wor The rest: ld! How are you? Čtení souboru: file.readlines() Použijte tuto techniku, pokud chcete načtením získat obsah ve formě seznamu řetězců (řádků).

In [14]: lines = f.readlines() print(lines) ['Hello, world!\n', 'How are you?'] Všimněte si, že jednotlivé řetězce obsahují také znak konce řádku, \n. Poslední řádek jej obsahovat může, ale nemusí. Těchto znaků se lze zbavit metodou str.strip(). In [15]: for line in lines: print(line.strip()) Hello, world! How are you? Čtení souboru: for <line> in <file> Tuto metodu použijte, pokud chcete udělat totéž s každým řádkem souboru od aktuální pozice do konce souboru. Zatímco předchozí techniky načetly najednou celý obsah souboru (který se nemusí vejít do paměti), tento způsob čte soubor řádek po řádku, což umožňuje zpracovávat velké soubory. In [16]: for line in f: s = line.strip() print("the line '" + s + "' contains " + str(len(s)) + " characters.") The line 'Hello, world!' contains 13 characters. The line 'How are you?' contains 12 characters. Čtení souboru: file.readline() Tato metoda umožňuje načíst ze souboru vždy jediný řádek, což je užitečné, když chcete takto načítat jen část souboru. Předpokládejme, že chceme načíst následující textový soubor, který obsahuje několik různých částí. První řádek je stručný popis dat. Další řádky začínající # jsou komentáře. Zbytek souboru obsahuje data.

In [17]: %%writefile data_collatz_5.txt Collatz 3n+1 sequence, starting from 5. # The next number in a Collatz sequence is either 3n+1 if n is odd, # or n/2 if n is even. 5 16 8 4 2 1 Overwriting data_collatz_5.txt Zkusme takový soubor načíst. Použijeme readline() k načtení popisu a komentářů, data načteme metodou for line in file. In [18]: with open('data_collatz_5.txt', 'r', encoding='utf 8') as f: # Read the description line description = f.readline().strip() # Read all the comment lines comments = [] line = f.readline().strip() while line.startswith('#'): comments.append(line) line = f.readline().strip() data = [] data.append(int(line)) for line in f: data.append(int(line)) print("description:", description) print("comments:", comments) print("data:", data) Description: Collatz 3n+1 sequence, starting from 5. Comments: ['# The next number in a Collatz sequence is either 3n+1 if n is odd,', '# or n/2 if n is even.'] Data: [5, 16, 8, 4, 2, 1] Zamyslete se: Je tento kód napsaný čistě? Je znovupoužitelný? Šlo by jej dekomponovat? Na jaké části?

Čtení souboru "z internetu" Pokud je soubor dostupný na Internetu, lze jej číst velmi podobně, jako soubor umístěný na lokálním disku. Stačí použít funkci urllib.request.urlopen() (a samozřejmě být připojený k Internetu). Existuje zde ale mírný rozdíl: protože funkce urlopen neví, jaký typ souboru načítáte, metody read, readline, atd. vrací hodnoty typu bytes. Abychom z vrácené hodnoty dostali řetězec, musíme byty dekódovat, tj. přiřadit kódovací tabulku (nejlépe UTF 8, je li to možné). In [19]: url = r'http://www.gutenberg.org/cache/epub/1661/pg1661.txt' import urllib.request with urllib.request.urlopen(url) as text: intro = text.read() intro = intro.decode('utf 8') print(intro[:300]) Project Gutenberg's The Adventures of Sherlock Holmes, by Arthur Conan Doy le This ebook is for the use of anyone anywhere at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re use it under the terms of the Project Gutenberg License included with this eboo Zápis do souboru Zápis textu do souboru je velmi podobný načítání. Podobně, jako Python neodstranil znaky nového řádku při čtení, při zápisu budete muset sami tyto znaky do řetězců vložit. In [20]: with open('topics.txt', 'w', encoding='utf 8') as f: f.write('computer Science\n') f.write('programming\n') f.write('clean code\n') In [21]:!type topics.txt Computer Science Programming Clean code Připojení textu na konec existujícího souboru Pokud soubor otevřete pro zápis (mód 'w'), vytvoří se nový soubor, pokud ještě neexistuje; pokud už existuje, přepíše se novým. Když soubor otevřeme pro přidávání (mód 'a'), zapisované řetězce se připojí na konec souboru.

In [22]: with open('topics.txt', 'a', encoding='utf 8') as f: f.write('software Engineering\n') In [23]:!type topics.txt Computer Science Programming Clean code Software Engineering Příklad: Čtení a zápis Mějme soubor se 2 čísly na každém řádku: In [24]: %%writefile number_pairs.txt 1 1 10 20 1.3 2.7 Overwriting number_pairs.txt Vytvořme funkci se dvěma parametry názvem vstupního a výstupního souboru, která načte páry čísel ze vstupního souboru a zapíše je společně s jejich součtem do výstupního souboru. In [25]: def sum_number_pairs(infname, outfname): """Read data from input file, sum each row, write results to output file. (str, str) > None infname: the name of the input file containing a pair of numbers separated by whitespace on each line outfname: the name of the output file """ with open(infname, 'r', encoding='utf 8') as infile, \ open(outfname, 'w', encoding='utf 8') as outfile: for pair in infile: pair = pair.strip() operands = pair.split() total = float(operands[0]) + float(operands[1]) new_line = '{} + {} = {}\n'.format(operands[0], operands[1], total) outfile.write(new_line) Když funkci zavoláme, vytvoří se požadovaný výstupní soubor se správným obsahem.

In [26]: sum_number_pairs('number_pairs.txt', 'number_pairs_with_totals.txt')!type number_pairs_with_totals.txt 1 + 1 = 2.0 10 + 20 = 30.0 1.3 + 2.7 = 4.0 Shrnutí Práce s cestami k souborům a adresářům pomocí modulu os.path. Před čtením ze souboru nebo zápisem do souboru je třeba jej nejdřív otevřít! Funkce open(). Vždy specifikujte kódování: open(filename, mode, encoding='utf 8'). Když jste hotovi, musíte soubor zase zavřít! Metoda f.close(). Příkaz with zajistí automatické uzavření souboru! contents = f.read() #... and do other things to the opened file # When you get here, the file is not opened anymore. Nastavení notebooku Ignorujte jej. In [27]: from notebook.services.config import ConfigManager cm = ConfigManager() cm.update('livereveal', { 'theme': 'Simple', 'transition': 'slide', 'start_slideshow_at': 'selected', 'width': 1268, 'height': 768, 'minscale': 1.0 }) Out[27]: {'height': 768, 'minscale': 1.0, 'start_slideshow_at': 'selected', 'theme': 'Simple', 'transition': 'slide', 'width': 1268}