Existují i jiné programovací jazyky než Python.
Ostatní jazyky neumí pracovat s pythonními hodnotami. Budeš-li se chtít s takovými programy „domluvit” – předat jim nějaké informace ke zpracování nebo od nich dostat výsledky – musíš informace předávat v nějaké zjednodušené podobě.
Většina programovacích jazyků má nějaká čísla, nějaký druh seznamů,
nějakou odrůdu řetězců a nějakou variaci na slovníky
(nebo několik způsobů jak slovníky vytvořit).
Dále má spousta jazyků způsob, jak zapsat
True
, False
a None
.
Tyhle základní typy většinou stačí na předání
jakékoli informace v rozumně čitelné podobě,
i když ne ve všech jazycích mají přesné ekvivalenty
(třeba Python má dva základní druhy čísel – int
a float
).
Často se proto v komunikaci omezíme na ně.
Další problém je přenos dat: abys mohla informace zapsat na disk nebo přenést přes Internet, musíš je převést na sekvenci bytů (čísel od 0 do 255). Zjednodušeně řečeno, musíš je převést na řetězec.
Existuje spousta způsobů, jak zakódovat data do textu. Každý způsob se snaží najít vhodnou rovnováhu mezi čitelností pro lidi/počítače, délkou zápisu, bezpečností, možnostmi a rozšiřitelností. My už známe syntaxi Pythonu:
{
'jméno': 'Anna',
'město': 'Brno',
'jazyky': ['čeština', 'angličtina', 'Python'],
'věk': 26,
}
Jiný způsob zápisu dat je YAML:
jméno: Anna
město: Brno
jazyky:
- čeština
- angličtina
- Python
věk: 26
Nebo třeba Bencode:
d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae
Existují i netextové formáty, jako Pickle 3:
}q(XjménoqXAnnaqXmÄtoqXBrnoqXjazykyq]q(X ÄeÅ¡tinaqX
angliÄtinaXPythonq eXvÄq
K▒u.
A nakonec uvedu JSON (z angl. Javascript Object Notation „zápis Javascriptových objektů”), který se pro svou jednoduchost rozšířil na Internetu nejvíc:
{
"jméno": "Anna",
"město": "Brno",
"jazyky": ["čeština", "angličtina", "Python"],
"věk": 26
}
Pozor na to, že ačkoli JSON vypadá podobně jako zápis v Pythonu, je to jiný formát s vlastními pravidly. Nezaměňuj je!
Aspoň ze začátku nedoporučuji JSON psát ručně; nech na počítači, aby dal na správné místo správné čárky a uvozovky.
Kódování objektů v JSONu je jednoduché: existuje modul json
,
jehož metoda loads
načte data z řetězce:
import json
json_retezec = """
{
"jméno": "Anna",
"město": "Brno",
"jazyky": ["čeština", "angličtina", "Python"],
"věk": 26
}
"""
data = json.loads(json_retezec)
print(data)
print(data['město'])
A pak tu je metoda dumps
, která naopak daná data zakóduje
a vrátí řetězec:
>>> print(json.dumps(data))
{"v\u011bk": 26, "jm\u00e9no": "Anna", "jazyky": ["\u010de\u0161tina", "angli\u010dtina", "Python"], "m\u011bsto": "Brno"}
To, co vrátí jednoduché zavolání dumps(data)
je vhodné pro počítačové
zpracování;
má-li výsledná data číst člověk, nastav
ensure_ascii=False
(aby se písmenka s diakritikou nekódovala pomocí \
)
a indent=2
(odsazení dvěma mezerami).
>>> print(json.dumps(data, ensure_ascii=False, indent=2))
{
"věk": 26,
"jméno": "Anna",
"jazyky": [
"čeština",
"angličtina",
"Python"
],
"město": "Brno"
}
Kompletní popis modulu json
–
včetně funkcí na zápis/čtení přímo do/ze souborů –
je v příslušné dokumentaci.
{ "data": { "sessionMaterial": { "id": "session-material:2019/pyladies-brno-jaro-st:file:2", "title": "JSON", "html": "\n \n \n\n <h1>JSON</h1>\n<p>Existují i jiné programovací jazyky než Python.</p>\n<p>Ostatní jazyky neumí pracovat s pythonními hodnotami.\nBudeš-li se chtít s takovými programy „domluvit” –\npředat jim nějaké informace ke zpracování\nnebo od nich dostat výsledky –\nmusíš informace předávat v nějaké zjednodušené podobě.</p>\n<h2>Typy</h2>\n<p>Většina programovacích jazyků má nějaká čísla, nějaký druh seznamů,\nnějakou odrůdu řetězců a nějakou variaci na slovníky\n(nebo několik způsobů jak slovníky vytvořit).\nDále má spousta jazyků způsob, jak zapsat\n<code>True</code>, <code>False</code> a <code>None</code>.</p>\n<p>Tyhle základní typy většinou stačí na předání\njakékoli informace v rozumně čitelné podobě,\ni když ne ve všech jazycích mají přesné ekvivalenty\n(třeba Python má dva základní druhy čísel – <code>int</code> a <code>float</code>).\nČasto se proto v komunikaci omezíme na ně.</p>\n<h2>Kódování dat</h2>\n<p>Další problém je přenos dat:\nabys mohla informace zapsat na disk nebo přenést\npřes Internet, musíš je převést na sekvenci <em>bytů</em> (čísel od 0 do 255).\nZjednodušeně řečeno, musíš je převést na řetězec.</p>\n<p>Existuje spousta způsobů, jak zakódovat data do textu.\nKaždý způsob se snaží najít vhodnou rovnováhu mezi\nčitelností pro lidi/počítače, délkou zápisu,\nbezpečností, možnostmi a rozšiřitelností.\nMy už známe syntaxi Pythonu:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"p\">{</span>\n <span class=\"s1\">'jméno'</span><span class=\"p\">:</span> <span class=\"s1\">'Anna'</span><span class=\"p\">,</span>\n <span class=\"s1\">'město'</span><span class=\"p\">:</span> <span class=\"s1\">'Brno'</span><span class=\"p\">,</span>\n <span class=\"s1\">'jazyky'</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">'čeština'</span><span class=\"p\">,</span> <span class=\"s1\">'angličtina'</span><span class=\"p\">,</span> <span class=\"s1\">'Python'</span><span class=\"p\">],</span>\n <span class=\"s1\">'věk'</span><span class=\"p\">:</span> <span class=\"mi\">26</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</pre></div><p>Jiný způsob zápisu dat je <a href=\"http://www.yaml.org/\">YAML</a>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nt\">jméno</span><span class=\"p\">:</span> <span class=\"l l-Scalar l-Scalar-Plain\">Anna</span>\n<span class=\"nt\">město</span><span class=\"p\">:</span> <span class=\"l l-Scalar l-Scalar-Plain\">Brno</span>\n<span class=\"nt\">jazyky</span><span class=\"p\">:</span>\n <span class=\"p p-Indicator\">-</span> <span class=\"l l-Scalar l-Scalar-Plain\">čeština</span>\n <span class=\"p p-Indicator\">-</span> <span class=\"l l-Scalar l-Scalar-Plain\">angličtina</span>\n <span class=\"p p-Indicator\">-</span> <span class=\"l l-Scalar l-Scalar-Plain\">Python</span>\n<span class=\"nt\">věk</span><span class=\"p\">:</span> <span class=\"l l-Scalar l-Scalar-Plain\">26</span>\n</pre></div><p>Nebo třeba <a href=\"http://en.wikipedia.org/wiki/Bencode\">Bencode</a>:</p>\n<div class=\"highlight\"><pre><code>d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae</code></pre></div><p>Existují i netextové formáty, jako\n<a href=\"https://docs.python.org/3/library/pickle.html\">Pickle 3</a>:</p>\n<div class=\"highlight\"><pre><code>}q(XjménoqXAnnaqXmÄtoqXBrnoqXjazykyq]q(X ÄeÅ¡tinaqX\n angliÄtinaXPythonq eXvÄq\nK▒u.</code></pre></div><p>A nakonec uvedu <a href=\"http://json.org/\">JSON</a>\n(z angl. <em>Javascript Object Notation</em> „zápis Javascriptových objektů”),\nkterý se pro svou jednoduchost rozšířil na Internetu nejvíc:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"p\">{</span>\n <span class=\"nt\">"jméno"</span><span class=\"p\">:</span> <span class=\"s2\">"Anna"</span><span class=\"p\">,</span>\n <span class=\"nt\">"město"</span><span class=\"p\">:</span> <span class=\"s2\">"Brno"</span><span class=\"p\">,</span>\n <span class=\"nt\">"jazyky"</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">"čeština"</span><span class=\"p\">,</span> <span class=\"s2\">"angličtina"</span><span class=\"p\">,</span> <span class=\"s2\">"Python"</span><span class=\"p\">],</span>\n <span class=\"nt\">"věk"</span><span class=\"p\">:</span> <span class=\"mi\">26</span>\n<span class=\"p\">}</span>\n</pre></div><div class=\"admonition note\"><p>Pozor na to, že ačkoli JSON vypadá podobně jako zápis\nv Pythonu, je to jiný formát s vlastními pravidly.\nNezaměňuj je!</p>\n<p>Aspoň ze začátku nedoporučuji JSON psát ručně;\nnech na počítači, aby dal na správné místo správné\nčárky a uvozovky.</p>\n</div><h2>JSON v Pythonu</h2>\n<p>Kódování objektů v JSONu je jednoduché: existuje modul <code>json</code>,\njehož metoda <code>loads</code> načte data z řetězce:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">json</span>\n\n<span class=\"n\">json_retezec</span> <span class=\"o\">=</span> <span class=\"s2\">"""</span>\n<span class=\"s2\"> {</span>\n<span class=\"s2\"> "jméno": "Anna",</span>\n<span class=\"s2\"> "město": "Brno",</span>\n<span class=\"s2\"> "jazyky": ["čeština", "angličtina", "Python"],</span>\n<span class=\"s2\"> "věk": 26</span>\n<span class=\"s2\"> }</span>\n<span class=\"s2\">"""</span>\n\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">json_retezec</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">[</span><span class=\"s1\">'město'</span><span class=\"p\">])</span>\n</pre></div><p>A pak tu je metoda <code>dumps</code>, která naopak daná data zakóduje\na vrátí řetězec:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">))</span>\n<span class=\"go\">{"v\\u011bk": 26, "jm\\u00e9no": "Anna", "jazyky": ["\\u010de\\u0161tina", "angli\\u010dtina", "Python"], "m\\u011bsto": "Brno"}</span>\n</pre></div><p>To, co vrátí jednoduché zavolání <code>dumps(data)</code> je vhodné pro počítačové\nzpracování;\nmá-li výsledná data číst člověk, nastav\n<code>ensure_ascii=False</code> (aby se písmenka s diakritikou nekódovala pomocí <code>\\</code>)\na <code>indent=2</code> (odsazení dvěma mezerami).</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">>>> </span><span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">ensure_ascii</span><span class=\"o\">=</span><span class=\"bp\">False</span><span class=\"p\">,</span> <span class=\"n\">indent</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n<span class=\"go\">{</span>\n<span class=\"go\"> "věk": 26,</span>\n<span class=\"go\"> "jméno": "Anna",</span>\n<span class=\"go\"> "jazyky": [</span>\n<span class=\"go\"> "čeština",</span>\n<span class=\"go\"> "angličtina",</span>\n<span class=\"go\"> "Python"</span>\n<span class=\"go\"> ],</span>\n<span class=\"go\"> "město": "Brno"</span>\n<span class=\"go\">}</span>\n</pre></div><p>Kompletní popis modulu <code>json</code> –\nvčetně funkcí na zápis/čtení přímo do/ze souborů –\nje v příslušné <a href=\"https://docs.python.org/3/library/json.html\">dokumentaci</a>.</p>\n\n\n " } } }