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.

Ř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.

In [1]:
print("řetězce jsou ve dvojitých")
řetězce jsou ve dvojitých
In [2]:
print('nebo jednoduchých uvozovkách, tj. " nebo \'')
nebo jednoduchých uvozovkách, tj. " nebo '
In [3]:
print('řetězce spojíme ' + 'operátorem +')
řetězce spojíme operátorem +
In [4]:
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
In [5]:
# unicode uděláme pomocí u" ... "
print(u"Τὴ γλῶσσα μοῦ ἔδωσαν ἑλληνικὴ")
Τὴ γλῶσσα μοῦ ἔδωσαν ἑλληνικὴ
In [6]:
# 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}}\]
In [7]:
s = u"řřeettěězzccee  ppooddppoorruujjíí  řřeezzyy"
print(s[::2])
řetězce podporují řezy
In [8]:
s = u"řetězce lze " + 3 * u"násobit "
print(s)
řetězce lze násobit násobit násobit 

Upozornění: V Pythonu3 jsou řetězce standardně unikódové (a u'' syntax je zde zbytečná).

Formátování

Jak vypsat proměnné a zároveň je (pokud možno hezky) naformátovat jsme už také mnohokrát viděli. Připomeneme si to na několika příkladech. Budeme používat modernější způsob pomocí metody format.

In [9]:
a = 1
b = 3.1
# {} vloží proměnné za sebou, na formátování se použije str 
s = "číslo 1 = {}, číslo 2 = {}".format(a, b)
print(s)
číslo 1 = 1, číslo 2 = 3.1
In [10]:
# první číslo je pořadí argumentu, .1f znamená jedno desetinné místo
s = "číslo 2 = {1:.1f}, číslo 1 = {0:.1f}".format(a, b)
print(s)
číslo 2 = 3.1, číslo 1 = 1.0
In [11]:
# format umí pracovat se slovníky
table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
      'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

Více se dozvíte v tutorialu, vše pak v dokumentaci.

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.

In [12]:
", ".join([m for m in dir("") if not m.startswith("_")])
Out[12]:
'capitalize, casefold, center, count, encode, endswith, expandtabs, find, format, format_map, index, isalnum, isalpha, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper, join, ljust, lower, lstrip, maketrans, partition, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill'

Mezery apod. ořízneme pomocí strip.

In [13]:
s = "  \t abc\n\n"
print(s)
print(s.strip())
  	 abc


abc

Často se hodí split, je to vlastně opak join.

In [14]:
s = u"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

In [15]:
print(u"všechna písmena velká".upper())
VŠECHNA PÍSMENA VELKÁ

Základy práce se soubory

Pro práci se sounory je základní příkaz open, který vrací instanci file

In [16]:
f = open("/proc/cpuinfo", "r")
print(f)
<_io.TextIOWrapper name='/proc/cpuinfo' mode='r' encoding='UTF-8'>
In [17]:
# metody file
", ".join([m for m in dir(f) if not m.startswith("_")])
Out[17]:
'buffer, close, closed, detach, encoding, errors, fileno, flush, isatty, line_buffering, mode, name, newlines, read, readable, readline, readlines, seek, seekable, tell, truncate, writable, write, writelines'
In [18]:
# teď soubor zavřeme
f.close()

Nejčastější je procházet soubor jako iterátor.

In [19]:
f = open("/proc/cpuinfo", "r")
ncpu = 0
for l in f:
    if l.startswith("processor"):
        ncpu += 1
    if ncpu < 2:
        print(l.strip())
f.close()
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Intel(R) Core(TM)2 Duo CPU     E6550  @ 2.33GHz
stepping	: 11
microcode	: 0xb6
cpu MHz		: 2331.000
cache size	: 4096 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow vnmi flexpriority
bugs		:
bogomips	: 4675.29
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

Pro práci se soubory je velice užitečný 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é:

In [20]:
with open("/proc/meminfo", "r") as ff:
    print(ff.readline().strip())
    print(ff)
print(ff)
MemTotal:        6102984 kB
<_io.TextIOWrapper name='/proc/meminfo' mode='r' encoding='UTF-8'>
<_io.TextIOWrapper name='/proc/meminfo' mode='r' encoding='UTF-8'>

Komentáře

Comments powered by Disqus