files November 20, 2018

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

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

Programování v Pythonu

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.

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

Datové typy a struktury

Konečný automat. Jan Kybic.

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

Systém souborů (file system, FS)

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

Úvod do programování 8. hodina

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

POČÍTAČE A PROGRAMOVÁNÍ

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

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ů

Ošetřování chyb v programech

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

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

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

PHP a Large Objecty v PostgreSQL

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

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

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

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

Programovací jazyk Pascal

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

Textové soubory. alg9 1

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

Soubor jako posloupnost bytů

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

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

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

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

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

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

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

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

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

Základy programování (IZP)

Vestavěné nástroje Pythonu

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

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

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

Archiv elektronických dokumentů Zela

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Šablonovací systém htmltmpl vypracoval: Michal Vajbar, Šablonovací systém htmltmpl

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

Algoritmizace a programování

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

Textové popisky. Typ dat

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

Implementace LL(1) překladů

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

Programování v Pythonu

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

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

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

Django Urls, views, templates

7. Datové typy v Javě

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

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

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

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

Informatika / o souborech

CSS Stylování stránek. Zpracoval: Petr Lasák

Základy PERLu snadno a rychle

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

Dnešní téma. Oblasti standardizace v ICT. Oblasti standardizace v ICT. Oblasti standardizace v ICT

10 Algoritmizace Příklad 2 Word 2007/ VBA

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

programátorský manuál

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

První kapitola úvod do problematiky

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

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

LOGBOOK. Blahopřejeme, našli jste to! Nezapomeňte. Prosím vyvarujte se downtrade

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

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

Systém souborů Mgr. Josef Horálek

Základní příkazy pro práci se soubory

MIDAM Simulátor Verze 1.5

1 Uživatelská dokumentace

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

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

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

Zápis programu v jazyce C#

Zásadní dovednosti Indesign. Stručné otázky a odpovědi

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

Programování v Pythonu

Principy operačních systémů. Lekce 7: Souborový systém

Úvod do programovacích jazyků (Java)

Ing. Michal Martin. Spojení PLC CLICK s NA-9289

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

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

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Počítačové sítě Systém pro přenos souborů protokol FTP

Operační systémy 2: Zápočtové úkoly

Natural Language Toolkit

Transkript:

files November 20, 2018 1 Soubory Petr Pošík, Tomáš Svoboda Katedra kybernetiky, FEL ČVUT v Praze OI, B4B33RPH: Řešení problémů a hry, 2018 Prerekvizity: * Cykly 2 Ú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. 3 Adresáře a cesty Adresář (složka) je organizační jednotka souborového systému. Hierarchické členění. Může obsahovat soubory nebo další adresáře. Každý adresář je sám součástí jiného adresáře (s výjimkou kořenového). Kořenový adresář Je vždy v souborovém systému přítomen a představuje počátek struktury. Obvykle se označuje (/). MS Windows mají zvláštní kořenový adresář na každém disku (\). Každý adresář obsahuje 2 zvláštní položky: *. je odkaz na adresář samotný *.. je odkaz na nadřazený adresář 3.1 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). getcwd z modulu os. In [ ]: import os print(os.getcwd()) Cesty 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: 1

/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 3.2 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 [ ]: import os orig_wd = os.getcwd() os.chdir('/home/svoboda/tmp') print(os.getcwd()) Nyní jsme v jiném pracovním adresáři. A můžeme jej změnit zpět: In [ ]: os.chdir(orig_wd) print(os.getcwd()) 3.3 Práce s cestami Modul os.path obsahuje funkce pro práci se souborovými cestami: In [ ]: fpath = os.path.abspath('files.pdf') print(fpath) In [ ]: print(os.path.dirname(fpath)) In [ ]: print(os.path.basename(fpath)) In [ ]: print(os.path.splitext(os.path.basename(fpath))) Jak správně vytvořit cestu z jednotlivých fragmentů? In [ ]: fpath2 = os.path.join('/', 'Users', 'svoboda', 'tmp') print(fpath2) Jak získat cestu k adresáři nebo souboru relativní k aktuálnímu pracovnímu adresáři? In [ ]: print(os.path.relpath(fpath2)) 2

4 Soubory 4.1 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. 4.2 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... 4.3 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. 4.4 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 [ ]: %%writefile text.txt Hello, world! How are you? Nyní můžeme onen soubor načíst pomocí Pythonu a zobrazit jeho obsah: In [4]: file = open('text.txt', 'r') contents = file.read() file.close() print(contents) 3

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. 4.5 Příklad II: čtení obsahu souboru In [ ]: file = open('text-iso.txt', 'r') content = file.read() file.close() print(content) 4.6 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ět 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! 4.7 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í: f = open('file_to_open.txt', 'r', encoding='utf-8') # Do something with f f.close() nebo with open('file_to_open.txt', 'r', encoding='utf-8') as f: # Do something with f 4

4.8 Kódování In [ ]: import locale locale.getpreferredencoding() Co když má uživatel jiné výchozí kódování? :-( http://kunststube.net/encoding/ https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-softwaredeveloper-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/ https://en.wikipedia.org/wiki/utf-8 4.9 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: with open('text.txt', 'r', encoding='utf-8') as f: contents = f.read() print(contents) 4.10 Č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 [ ]: with open('text.txt', 'r', encoding='utf-8') as f: contents = f.read() print(contents) 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 [ ]: with open('text.txt', 'r', encoding='utf-8') as f: first_10_chars = f.read(10) the_rest = f.read() print("the first 10 chars:", first_10_chars) print("the rest:", the_rest) 5

4.11 Čtení souboru: file.readlines() Použijte tuto techniku, pokud chcete načtením získat obsah ve formě seznamu řetězců (řádků). In [ ]: with open('text.txt', 'r', encoding='utf-8') as f: lines = f.readlines() print(lines) 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 [ ]: for line in lines: print(line.strip()) 4.12 Č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 [ ]: with open('text.txt', 'r', encoding='utf-8') as f: for line in f: s = line.strip() print("the line '" + s + "' contains " + str(len(s)) + " characters 4.13 Č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 [ ]: %%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 Zkusme takový soubor načíst. Použijeme readline() k načtení popisu a komentářů, data načteme metodou for line in file. 6

In [ ]: 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) Zamyslete se: * Je tento kód napsaný čistě? * Je znovupoužitelný? * Šlo by jej dekomponovat? Na jaké části? 4.14 Č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 [ ]: 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]) 4.15 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 [ ]: 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 [ ]: %cat topics.txt 7

4.16 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 [ ]: with open('topics.txt', 'a', encoding='utf-8') as f: f.write('software Engineering\n') In [ ]: %cat topics.txt 4.17 Příklad: Čtení a zápis Mějme soubor se 2 čísly na každém řádku: In [ ]: %%writefile number_pairs.txt 1 1 10 20 1.3 2.7 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 [ ]: def sum_number_pairs(infname, outfname): """Read data from input file, sum each row, write results to output fil (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], to outfile.write(new_line) Když funkci zavoláme, vytvoří se požadovaný výstupní soubor se správným obsahem. In [ ]: sum_number_pairs('number_pairs.txt', 'number_pairs_with_totals.txt') %cat number_pairs_with_totals.txt 5 Shrnutí Práce s cestami k souborům a adresářům pomocí modulu os.path. 8

Před čtením ze souboru nebo zápisem do souboru je třeba jej nejdřív otevřít! open(). Funkce 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! with open('text.txt', 'r', encoding='utf-8') as f: contents = f.read() #... and do other things to the opened file # When you get here, the file is not opened anymore. 6 Nastavení notebooku Ignorujte jej. In [1]: from notebook.services.config import ConfigManager cm = ConfigManager() cm.update('livereveal', { 'theme': 'White', 'transition': 'none', 'start_slideshow_at': 'selected', 'scroll': True, 'center': True, 'width': '100%', 'height': '100%', 'minscale': 1.0 }) Out[1]: {'center': True, 'controls': False, 'height': '100%', 'minscale': 1.0, 'mousewheel': True, 'progress': True, 'scroll': True, 'slidenumber': True, 'start_slideshow_at': 'selected', 'theme': 'White', 'transition': 'none', 'width': '100%'} In [2]: %%HTML <style>.reveal #notebook-container { width: 90%!important; }.CodeMirror { max-width: 100%!important; }.output_subarea { max-width: 100%!important; } 9

.reveal pre { width: 100%;!important;} pre, code,.codemirror-code,.reveal pre,.reveal code { font-family: "Consolas", "Source Code Pro", "Courier New", Courier, mon } pre, code,.codemirror-code { font-size: inherit!important; }.reveal.code_cell { font-size: 130%!important; line-height: 130%!important; } </style> <IPython.core.display.HTML object> 10