15. Práce s řetězci a se soubory#
Podívejme se v rychlosti, jak Python pracuje s řetězci a se soubory. Ukážeme si základní principy a jednoduché příklady.
15.1. Řetězce – Python str#
S řetězci jsme se už setkali mnohokrát, řekli jsme si také, že str
objekt je immutable (neměnitelný). V rychlosti teď shrneme základy.
print("řetězce jsou ve dvojitých")
řetězce jsou ve dvojitých
print('nebo jednoduchých uvozovkách, tj. " nebo \'')
nebo jednoduchých uvozovkách, tj. " nebo '
print('řetězce spojíme ' + 'operátorem +')
řetězce spojíme operátorem +
print('+ můžeme případně vynechat, '
'takže dlouhé řetězce můžeme rozložit'
'do více řádků, nejlépe uvnitř závorek')
+ můžeme případně vynechat, takže dlouhé řetězce můžeme rozložitdo více řádků, nejlépe uvnitř závorek
Python podporuje unicode:
print("Τὴ γλῶσσα μοῦ ἔδωσαν ἑλληνικὴ")
Τὴ γλῶσσα μοῦ ἔδωσαν ἑλληνικὴ
# pokud chceme psát spoustu speciálních znaků, např. \, použijeme r" ..."
# to se hodí třeba pro LaTeX
print(r"\[\frac{{\partial \psi }}{{\partial R}}\]")
\[\frac{{\partial \psi }}{{\partial R}}\]
s = "řřeettěězzccee ppooddppoorruujjíí řřeezzyy"
print(s[::2])
řetězce podporují řezy
s = "řetězce lze " + 3 * "násobit "
print(s)
řetězce lze násobit násobit násobit
f-strings#
Python 3.6 zavedl moderní způsob formátování řetězců pomoci tzv. f-strings. Syntaxe je velice jednoduchá: před první uvozovky vložit znak f
a pak všechny výrazy uvnitř {složených závorek}
nahradit jejich textovou reprezentací.
Např.:
name = "Eric"
age = 74
f"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'
f"2 * 37 = {2 * 37}"
'2 * 37 = 74'
Můžeme volat i metody / funce:
name = "Eric Idle"
f"{name.lower()} is funny."
'eric idle is funny.'
Výrazy se dají formátovat pomocí formátovacího mini-jazyka:
import decimal
value = decimal.Decimal("12.34567")
width = 10
precision = 4
f"result: {value:{width}.{precision}}"
'result: 12.35'
import datetime as dt
today = dt.date.today()
f"Taday is {today:%B %d, %Y}"
'Taday is January 16, 2025'
Existují ještě dva starší (zastaralé) způsoby formátování: pomocí %
operátoru a pomocí format
metody. Doporučení je používat už jen f-strings, případně string.Template
. Viz např. https://realpython.com/python-string-formatting/#which-string-formatting-method-should-you-use.

Metody třídy str
#
Výpis “veřejných” metod str
, k němuž použijeme join
pro vytvoření řetězce z iterátoru a startswith
pro test začátku řetězce.
", ".join([m for m in dir("") if not m.startswith("_")])
'capitalize, casefold, center, count, encode, endswith, expandtabs, find, format, format_map, index, isalnum, isalpha, isascii, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper, join, ljust, lower, lstrip, maketrans, partition, removeprefix, removesuffix, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill'
Mezery apod. ořízneme pomocí strip
.
s = " \t abc\n\n"
print(s)
print(s.strip())
abc
abc
Často se hodí split, je to vlastně opak join.
s = "1, 2, 3, čtyři, 5"
# rozdílema na částí oddělené čárkou
s = s.split(",")
print(s)
# zkusíme převést na čísla
s = [int(a) for a in s if a.strip().isdigit()]
print(s)
['1', ' 2', ' 3', ' čtyři', ' 5']
[1, 2, 3, 5]
Velikost písmen mění upper
, lower
, capitalize
, swapcase
print("všechna písmena velká".upper())
VŠECHNA PÍSMENA VELKÁ
15.2. Základy práce se soubory#
Pro práci se sounory je základní příkaz open
, který vrací instanci file
f = open("./150_prace-s-retezci-a-se-soubory.ipynb", "r")
print(f)
<_io.TextIOWrapper name='./150_prace-s-retezci-a-se-soubory.ipynb' mode='r' encoding='UTF-8'>
# metody file
", ".join([m for m in dir(f) if not m.startswith("_")])
'buffer, close, closed, detach, encoding, errors, fileno, flush, isatty, line_buffering, mode, name, newlines, read, readable, readline, readlines, reconfigure, seek, seekable, tell, truncate, writable, write, write_through, writelines'
# teď soubor zavřeme
f.close()
Nejčastější je procházet soubor jako iterátor.
f = open("./150_prace-s-retezci-a-se-soubory.ipynb", "r")
# print first 10 lines with line numbers and max 20 characters per line
for count, line in enumerate(f):
print(f"{count}: {line[:20].rstrip()}")
if count == 10:
break
f.close()
0: {
1: "cells": [
2: {
3: "cell_type": "mar
4: "metadata": {},
5: "source": [
6: "Podívejme se v
7: "<!-- TEASER_END
8: ]
9: },
10: {
Pro práci se soubory je velice užitečný (a jednoznačně preferevaný) blok with
, který používá tzv. context managery. To nám zajistí, že soubor bude vždy zavřen, i když během práce se souborem dojde k chybě (neodchycená výjimka). Nahrazuje to tak try..except..finally
blok.
Použití je velice jednoduché, předchozí příklad by vypadal takto:
with open("./150_prace-s-retezci-a-se-soubory.ipynb", "r") as f:
# print first 10 lines with line numbers and max 20 characters per line
for count, line in enumerate(f):
print(f"{count}: {line[:20].rstrip()}")
if count == 10:
break
0: {
1: "cells": [
2: {
3: "cell_type": "mar
4: "metadata": {},
5: "source": [
6: "Podívejme se v
7: "<!-- TEASER_END
8: ]
9: },
10: {
Všimněte si, že chybí explicitní volání f.close()
.