{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"anaconda-cloud": {},
"hide_input": false,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
},
"latex_envs": {
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 0
},
"name": "mintapelda03.ipynb",
"colab": {
"name": "kl_py_szovek_feldolgozas.ipynb",
"provenance": [],
"collapsed_sections": [
"rKxMJyNJbv6m",
"J3LVLNNebv6_"
],
"include_colab_link": true
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iy3rxFX2bv5g",
"colab_type": "text"
},
"source": [
"# File-ok feldolgozása\n",
"\n",
"\n",
"Nagy mennyiségű adatok feldolgozásánál elengedthetetlen dolog a számítógépek memóriáján (RAM) kívűl a külső tárolókon (merevlemezek, egyéb adathordozók) tárolt file-ok megfelelő használata is.\n",
"\n",
"Az alábbiakban a python alapértelmezett filekezelő függvényeivel ismerkedünk meg, \n",
"majd a `numpy` csomag filekezelő rutinjaival barátkozunk meg.\n",
"\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6bDUFhTRbv5j",
"colab_type": "code",
"colab": {},
"outputId": "e1be4345-f0a6-4bc4-bf0f-733c4d0d432b"
},
"source": [
"%pylab inline"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tsEcLupCbv5m",
"colab_type": "text"
},
"source": [
"---\n",
"\n",
"## A python beépített filekezelő függvényei\n",
"\n",
"Ebben a fejezetben a `python` egyéb moduloktól független, alapvető fileműveleteket biztosító függvényeivel fogunk megismerkedni. Ezen függvények egy file tartalmát többnyire karakterláncok formájában kezelik, ezért konkrét formátumú adatok beolvasása, illetve kiírása némi bonyodalommal jár, melyeket legtöbbször valamilyen specifikusan az adott feladatra megírt függvény tesz lehetővé. Az alábbi részben a történelmi napfoltszám-megfigyelések [adatainak](http://www.sidc.be/silso/datafiles) az elemzésén keresztül ismerkedünk meg ezekkel a függvényekkel. "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q-Z0jT9Pbv5n",
"colab_type": "text"
},
"source": [
"### File-ok beolvasása"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "an4ufTNxbv5n",
"colab_type": "text"
},
"source": [
"Egész file beolvasása egyetlen karakterláncba az alábbiak szerint történik. \n",
"\n",
"Előszöris az `open()` függvény segítségével megnyitjuk a beolvasni kívánt file-t. Az `open()` függvény egy előkészítő függvény, amely arra készíti fel a rendszert, hogy az adott merevelemezen (vagy más adattárolón) fellelhető file-lal dolgozni tudjunk. Legegyszerűbb esetben ez a file nevének a megadásával történik."
]
},
{
"cell_type": "code",
"metadata": {
"id": "i1mxF5c9bv5o",
"colab_type": "code",
"colab": {}
},
"source": [
"file1 = open('SN_m_tot_V2.0.txt')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "UpOkj9CEbv5q",
"colab_type": "text"
},
"source": [
"A fenti kódsor hatására a `file1` változón keresztül férhetünk hozzá a file tartalmához. A file teljes tartalmát például a következő utasítással tölthetjük be egy karakterlánc formájában az `egeszfile` változóba:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "qEUrOfJLbv5r",
"colab_type": "code",
"colab": {}
},
"source": [
"egeszfile=file1.read()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "xxjLeXpDbv5s",
"colab_type": "text"
},
"source": [
"Figyelem, ne keverjük össze a `file1` és az `egeszfile` változókat! Amint azt fent is említettük, az `egeszfile` egy karakterlánc, a `file1` pedig a file-ból való olvasást, illetve a file-ba való írást segítő segédobjektum, amelyet szokás esetenként (adat)folyam-nak vagy angolul streamnek is nevezni."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CeLlku3dbv5t",
"colab_type": "text"
},
"source": [
"Ha már minden olvasás és írás befejeződött, akkor a `close()` utasítással zárhatjuk be a folyamot, azaz ez a parancs szakítja meg a kommunikációt az adattárolóval."
]
},
{
"cell_type": "code",
"metadata": {
"id": "eKFDo8qNbv5u",
"colab_type": "code",
"colab": {}
},
"source": [
"file1.close()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "paOipvH_bv5v",
"colab_type": "text"
},
"source": [
"Mivel fent betöltöttük a file tartalmát az `egeszfile` stringbe, ezért ennek segítségével bele is pillanthatunk, vizsgáljuk meg például az első 100 karaktert a file-ból:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "_18VFKXVbv5w",
"colab_type": "code",
"colab": {},
"outputId": "33117eae-8500-43f2-aa98-12efe7f20ccb"
},
"source": [
"egeszfile[:100]"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'#1. oszlop ev ho T[ev] napfolt_szam\\n#2. oszlop honap\\n#3. oszlop az ido evben merve \\n#4. oszlop Na'"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tcPWxcSQbv5y",
"colab_type": "text"
},
"source": [
"Ha megnézzük magát a [file](data/NAPFOLT/SN_m_tot_V2.0.txt)-t, akkor látható hogy tényleg ezek a dolgok vannak benne. Figyeljük meg hogy a sor vége helyett a `\\n` karakter szerepel! "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yglFZl1Dbv5z",
"colab_type": "text"
},
"source": [
"A `read()` függvény előre specifikált számú karakter olvasását is lehetővé teszi. Nyissuk meg ismét az előző file-t ismét:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dyGxLmNebv5z",
"colab_type": "code",
"colab": {}
},
"source": [
"file1 = open('SN_m_tot_V2.0.txt')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "FForOyPubv51",
"colab_type": "text"
},
"source": [
"Olvassunk be 10 karaktert a fileból az alábbi módon:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Qf5LtbvXbv53",
"colab_type": "code",
"colab": {}
},
"source": [
"karakterek1=file1.read(10)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EqF3JYgnbv55",
"colab_type": "text"
},
"source": [
"A `karakterek1` változó ezután a file első 10 karakterét tartalmazza (vessük össze ezt az `egeszfile[:100]` parancs kimenetével): "
]
},
{
"cell_type": "code",
"metadata": {
"id": "Sn00QFfMbv56",
"colab_type": "code",
"colab": {},
"outputId": "5184753d-4118-4c91-ca46-a125cdad2f83"
},
"source": [
"karakterek1"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'#1. oszlop'"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Rv2YIM-Jbv58",
"colab_type": "text"
},
"source": [
"Ha ismét meghívjuk a `file1` változó `read()` függvényét, akkor az a következő 10 karaktert olvassa be:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "3vUI1je0bv58",
"colab_type": "code",
"colab": {}
},
"source": [
"karakterek2=file1.read(10)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "yzouL_lebv5-",
"colab_type": "code",
"colab": {},
"outputId": "b8d649bd-bc9d-4804-b50b-39c25031f26b"
},
"source": [
"karakterek2"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"' ev ho T'"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7DHh84hYbv6A",
"colab_type": "text"
},
"source": [
"Látjuk tehát hogy a `read()` utasítás hatására könyörtelenül haladunk végig a file karakterein: úgy tűnhet, ha már egyszer valamit beolvastunk, akkor azt többé már nem tudjuk! Szerencsére ez nem így van, mivel a `tell()` és a `seek()` függvények segítségével kérdezhetjük le, illetve állíthatjuk be egy megnyitott filefolyam aktuális pozicióját."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hJ-dk2pCbv6A",
"colab_type": "text"
},
"source": [
"A `tell()` függvényt alkalmazva a `file1` változóra megkaphatjuk az aktuális folyampoziciót. Ami a jelen esetben 20, hiszen az előző két read parancs 10 karaktert olvasott be!"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Iv8CR_Jubv6B",
"colab_type": "code",
"colab": {},
"outputId": "af302d73-f974-4d9a-fde5-a233a82efbb9"
},
"source": [
"file1.tell()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"20"
]
},
"metadata": {
"tags": []
},
"execution_count": 11
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YSgClLrdbv6C",
"colab_type": "text"
},
"source": [
"A `seek()` parancs segítségével a file egy teszőleges helyére ugorhatunk. A `seek(n)` függvény alkalmazásával a file `n`-edik karakterére ugrunk. Ha ezután alkalmazzuk a `read()` függvényt, akkor a file tartalmát ettől a poziciótól olvassuk."
]
},
{
"cell_type": "code",
"metadata": {
"id": "kNDcCOTYbv6D",
"colab_type": "code",
"colab": {},
"outputId": "505b0785-30b4-419b-f518-1196f89c169d"
},
"source": [
"file1.seek(5)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"5"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bDVrq6uYbv6F",
"colab_type": "text"
},
"source": [
"Az alábbi parancs tehát a 5. karaktertől olvas be újabb 10 darab karaktert. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "a8EgE1owbv6F",
"colab_type": "code",
"colab": {}
},
"source": [
"karakterek3=file1.read(10)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ZagAi6l3bv6H",
"colab_type": "code",
"colab": {},
"outputId": "ea87c98c-c874-49c0-ccec-4c0add7aaafb"
},
"source": [
"karakterek3"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'szlop ev '"
]
},
"metadata": {
"tags": []
},
"execution_count": 14
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xXcX3nIrbv6J",
"colab_type": "text"
},
"source": [
"Zárjuk ismét be a file-t!"
]
},
{
"cell_type": "code",
"metadata": {
"id": "glJVt_sMbv6J",
"colab_type": "code",
"colab": {}
},
"source": [
"file1.close()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZXaJIpeIbv6N",
"colab_type": "text"
},
"source": [
"Nagyon sok esetben az adatfile-okban hordozott információ táblázatszerűen vannak rendezve. Az file minden sora hasonló tagolással csoportosítja a számunkra értékes adatokat. \n",
"Egy megnyitott file minden sorát - mint soronkénti karakterláncok listáját - a readlines függvény segítségével gyárthatjuk le."
]
},
{
"cell_type": "code",
"metadata": {
"id": "6hJrq6N9bv6O",
"colab_type": "code",
"colab": {}
},
"source": [
"file1 = open('SN_m_tot_V2.0.txt') "
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "4CCN3pzjbv6Q",
"colab_type": "code",
"colab": {}
},
"source": [
"sorok = file1.readlines()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0cp2I6EBbv6S",
"colab_type": "text"
},
"source": [
"Mivel már nincs szükség a a file-ra ezért be is csukjuk azt!"
]
},
{
"cell_type": "code",
"metadata": {
"id": "5CMiIHpHbv6S",
"colab_type": "code",
"colab": {}
},
"source": [
"file1.close() "
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KvFHOXbVbv6U",
"colab_type": "text"
},
"source": [
"A sorok lista minden eleme most tehát egy egy sor a file-ból, vizsgáljuk meg például az első 10 sort:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "STtYu9Lmbv6U",
"colab_type": "code",
"colab": {},
"outputId": "1dccd3d7-b071-4c7e-fa50-7db2d6fe63b0"
},
"source": [
"sorok[0:10]"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['#1. oszlop ev ho T[ev] napfolt_szam\\n',\n",
" '#2. oszlop honap\\n',\n",
" '#3. oszlop az ido evben merve \\n',\n",
" '#4. oszlop Napfoltok szamanak atlaga\\n',\n",
" '#5. oszlop Napfoltok szamanak szorasa, negativ ertekek azt jelentik hogy az informacio nem all rendelkezesre!\\n',\n",
" '#6. oszlop Napfolt meresek szama, negativ ertekek azt jelentik hogy az informacio nem all rendelkezesre!\\n',\n",
" '1749 01 1749.042 96.7 -1.0 -1 \\n',\n",
" '1749 02 1749.123 104.3 -1.0 -1 \\n',\n",
" '1749 03 1749.204 116.7 -1.0 -1 \\n',\n",
" '1749 04 1749.288 92.8 -1.0 -1 \\n']"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VGx2BlWVbv6X",
"colab_type": "text"
},
"source": [
"Amint látjuk, az első hat sor a '#' karakterrel kezdődik, és minden ilyen sor azt mondja meg hogy a tényleges adatok megfelelő oszlopa mit tartalmaz. A hetedik sortól lefelé viszont szóközökkel elválasztott számok vannak, ez maga a hőn áhitott adat, de sajnos még mindig karakterláncok formájában! "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AZsUxiofbv6X",
"colab_type": "text"
},
"source": [
"Az első értékes adatsor a file 7.-sora:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "tZPo_3q-bv6Y",
"colab_type": "code",
"colab": {},
"outputId": "d6b2be48-d111-47f7-e8b7-fff1f2fb6ba3"
},
"source": [
"sorok[6]"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"'1749 01 1749.042 96.7 -1.0 -1 \\n'"
]
},
"metadata": {
"tags": []
},
"execution_count": 20
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MI53c003bv6a",
"colab_type": "text"
},
"source": [
"Egy karakterláncot a `split()` parancs segítségével adott karakterek mentén fel tudunk vágni egy listába. A `split()` parancs alapértelmezésben szóközök szerint vágja fel a megjelölt karakterláncot, így az első értékes adatsor oszlopokra szabása az alábbiak szerint történik:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2UV6niefbv6b",
"colab_type": "code",
"colab": {},
"outputId": "6b3019a3-a53e-47ca-a35e-5430f8930d50"
},
"source": [
"sorok[6].split()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['1749', '01', '1749.042', '96.7', '-1.0', '-1']"
]
},
"metadata": {
"tags": []
},
"execution_count": 21
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ydicI8Tmbv6d",
"colab_type": "text"
},
"source": [
"Az eredmény tehát egy lista mely tartalmazza az értékes adatokat, ugyan még mindig karakterláncok formájában! \n",
"Az egyes elemeket lebegőpontos számmá a már ismert `float()` függvénnyel konvertálhatjuk. Tehát az első adatsor negyedik oszlopából a következő módon készíthetünk hús-vér számot:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "94oh9Nh3bv6e",
"colab_type": "code",
"colab": {},
"outputId": "4f862e2c-19bd-4477-a23f-5315f16ab252"
},
"source": [
"float(sorok[6].split()[3])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"96.7"
]
},
"metadata": {
"tags": []
},
"execution_count": 22
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GjlouhWwbv6f",
"colab_type": "text"
},
"source": [
"Ha már egy elemet számmá tudunk konvertálni, akkor egy `for` ciklus segítségével számokat tartalmazó listákba tudjuk rendezni az adatokat a már megszokott módon:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "YFTfOLIwbv6g",
"colab_type": "code",
"colab": {}
},
"source": [
"num_napfolt=[]\n",
"meresi_ido=[]\n",
"for sor in sorok[6:]:\n",
" num_napfolt.append( float(sor.split()[3]) )\n",
" meresi_ido.append( float(sor.split()[2]) )"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "PpgqWwTMbv6j",
"colab_type": "text"
},
"source": [
"Ábrázoljuk végül a napfoltok számát az évek függvényében:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "fVODObsDbv6k",
"colab_type": "code",
"colab": {},
"outputId": "935ac63b-c896-4ac1-fb95-cb3eb4cd03fa"
},
"source": [
"plot(meresi_ido,num_napfolt)\n",
"xlabel('T[ev]')\n",
"ylabel('Napfoltszam')"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
""
]
},
"metadata": {
"tags": []
},
"execution_count": 24
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nRK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rKxMJyNJbv6m",
"colab_type": "text"
},
"source": [
"### Mentés\n",
"\n",
"Az adatok beolvasása mellett sokszor lehet szükség a feldolgozott információ újbóli kiírására. Erre a `python` az adatfolyam típusú változókra alkalmazott `write()` függvényt kínálja. Vizsgáljuk meg, hogy hogy működik a fileírás, egy egyszerű példán! Nyissunk meg egy file-t, amelybe írni szeretnénk, ezt az `open()` függvény `mode` kulcsszavas paraméterén keresztül tudjuk jelezni a `mode='w'` beállítással. Itt a `w` az írási módot jelenti."
]
},
{
"cell_type": "code",
"metadata": {
"id": "B269Nr3Cbv6m",
"colab_type": "code",
"colab": {}
},
"source": [
"file2=open('mentes1.dat',mode='w')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "okemJHdLbv6n",
"colab_type": "text"
},
"source": [
"A `file2` folyamba a `write()` függvény segítségével tudunk karakterláncokat írni:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "IfybAFO-bv6o",
"colab_type": "code",
"colab": {},
"outputId": "bf9131db-8688-495b-98e9-8a3da316acc1"
},
"source": [
"file2.write('#Ez az elso kiirt fileom!\\n')"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"26"
]
},
"metadata": {
"tags": []
},
"execution_count": 26
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xol8rg1Wbv6p",
"colab_type": "text"
},
"source": [
"A write fügvény alapértelmezett visszatérési értéke a file-ba kiírt karakterek száma. A biztonság kedvéért zárjuk be a file-t!"
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "upkJ09Pbbv6q",
"colab_type": "code",
"colab": {}
},
"source": [
"file2.close()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hzLoZnygbv6r",
"colab_type": "text"
},
"source": [
"Ha már meglévő file-hoz szeretnénk további karaktereket fűzni, akkor az `open()` függvény `mode` paraméterének `mode='a'` beállításával jelezzük ezt. Az `'a'` karakter itt az append angol szó rövidítése, mely ismerős lehet már számunkra egy, a listákra vonatkozó függvény nevéből."
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "idtyAVFhbv6s",
"colab_type": "code",
"colab": {}
},
"source": [
"file2=open('data/mentes1.dat',mode='a')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "N2Qr21oYbv6u",
"colab_type": "text"
},
"source": [
"Írjuk ki a mérési idő (`meresi_ido`) és a napfoltok számát tartalmazó (`num_napfolt`) adatokat a már fent létrehozott `data/mentes1.dat` file-ba. \n",
"Ezt egy `for` ciklus segítségével fogjuk megtenni:"
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "GNELSZtjbv6u",
"colab_type": "code",
"colab": {}
},
"source": [
"for i in range(len(meresi_ido)):\n",
" file2.write(str(meresi_ido[i])+' '+str(num_napfolt[i])+'\\n')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "YrK3_l_kbv6x",
"colab_type": "text"
},
"source": [
"A `write()` függvény hasába írt karakterlánc a `meresi_ido` és `num_napfolt` tömbök megfelelő sorában lévő elemet tartalmazza szóközzel elválasztva, illetve a sor végét egy sortörés `'\\n'` -el jelezve."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-yBUqbnSbv6y",
"colab_type": "text"
},
"source": [
"Zárjuk ismét be a file-t:"
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "7owsOpRKbv6y",
"colab_type": "code",
"colab": {}
},
"source": [
"file2.close()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "yVwYGydTbv60",
"colab_type": "text"
},
"source": [
"A beolvasáshoz hasonlóan a kiíratásnál is van lehetőség egész sorok kiírására. Ezt, talán nem túl meglepő módon a `writelines()` függvény valósítja meg. Ez a függvény karakterláncok listáját írja ki egy file-ba egy megnyitott filefolyamon keresztül. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "h0Wo5Wn5bv61",
"colab_type": "code",
"colab": {}
},
"source": [
"file3=open('data/mentes2.dat',mode='w')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "h3sWNYcqbv63",
"colab_type": "text"
},
"source": [
"Ha a lista minden karakterlánca `'\\n'` karakterre végződik, akkor a kiíratás során a file-ban minden listaelem egy-egy külön sorba kerül:"
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "N8ynQX8Nbv64",
"colab_type": "code",
"colab": {}
},
"source": [
"sorok=['Ez az elso sor\\n','Ez a masodik sor\\n'];"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "D7aPKhUMbv66",
"colab_type": "code",
"colab": {}
},
"source": [
"file3.writelines(sorok)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "kDTQX6Zwbv67",
"colab_type": "text"
},
"source": [
"Mi történik, ha lemarad a `'\\n'` ? "
]
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "OH-wQNSzbv67",
"colab_type": "code",
"colab": {}
},
"source": [
"sorok=['Ez az harmadik','Ez hova kerult?\\n'];"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "5j94C02Bbv68",
"colab_type": "code",
"colab": {}
},
"source": [
"file3.writelines(sorok)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"collapsed": true,
"id": "Y1sTf-vxbv6-",
"colab_type": "code",
"colab": {}
},
"source": [
"file3.close()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "bOtqfaCabv6_",
"colab_type": "text"
},
"source": [
"Vizsgáljuk meg magát a file-t!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "J3LVLNNebv6_",
"colab_type": "text"
},
"source": [
"### Különös karakterek karakterláncokban\n",
"\n",
"A fentiekben már többször is találkoztunk a sortörést jelölő `'\\n' ` karakterrel. Ehhez hasonlóan van néhány más úgynevezett [literális](https://docs.python.org/2.0/ref/strings.html) karakter, amelynek speciális jelentése van. Ezek közül az alábbi táblázatban összefoglalunk néhányat:"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gTdKj-aubv7A",
"colab_type": "text"
},
"source": [
"\n",
"karakter |\tjelentés\n",
"-|-\n",
"\\n|\tsortörés\n",
"\\r|\tkocsi vissza\n",
"\\t|\tvízszintes kihagyás (TAB)\n",
"\\v| függőleges kihagyás (TAB)\n",
"\\xhh..| hexadecimális karakter hh.. értékkel\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pXDTNkHnbv7A",
"colab_type": "text"
},
"source": [
"A print függvény segítségével az alábbi példán demonstráljuk a `'\\r'`, `'\\t'`, és a már ismert `'\\n'` hatását:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "crHIHbgqbv7B",
"colab_type": "code",
"colab": {},
"outputId": "cf96c8dc-1785-448a-a38b-8df8e178e761"
},
"source": [
"print(\"EZEK ITT NAGYBETUKezek itt kisbetuk\")"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"EZEK ITT NAGYBETUKezek itt kisbetuk\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "pjuQ2m6sbv7D",
"colab_type": "code",
"colab": {},
"outputId": "29271d27-6be7-4c18-df7d-0dfb27b765d9"
},
"source": [
"print(\"EZEK ITT NAGYBETUK\\rezek itt kisbetuk\")"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"EZEK ITT NAGYBETUK\rezek itt kisbetuk\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "sT1GhzlWbv7G",
"colab_type": "code",
"colab": {},
"outputId": "4155de81-ea09-4beb-c0e0-6083c8b26a95"
},
"source": [
"print(\"EZEK ITT NAGYBETUK\\tezek itt kisbetuk\")"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"EZEK ITT NAGYBETUK\tezek itt kisbetuk\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "hHee6oP3bv7I",
"colab_type": "code",
"colab": {},
"outputId": "05e90a28-7e82-4197-b600-d6425b31be20"
},
"source": [
"print(\"EZEK ITT NAGYBETUK\\nezek itt kisbetuk\")"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"EZEK ITT NAGYBETUK\n",
"ezek itt kisbetuk\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vKRURUJGbv7J",
"colab_type": "text"
},
"source": [
"Ezek a karakterek file-ba való írás közben is hasonlóan viselkednek!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5jDlCQSxbv7J",
"colab_type": "text"
},
"source": [
"---\n",
"\n",
"## Numpy filekezelő rutinok"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8KyeJAorbv7K",
"colab_type": "text"
},
"source": [
"Amint korábbiakban is láthattuk, a `numpy` csomag `array` típusú változói számos előnyös tulajdonsággal rendelkeznek a sima `list` típusú változókhoz képest. \n",
"\n",
"A `numpy` csomag biztosít néhány hasznos filekezelő rutint, melyek az `array` tipusú változók file-ba kiírására, illetve file-okból történő beolvasására használhatóak. Az alábbiakban két érdekes példán keresztül fogjuk megvizsgálni ezeket a függvényeket.\n",
"\n",
"\n",
"Elemezzük Felix Baumgartner ugrásának adatait. \n",
"Az ugrás megtett út$--$idő adatait a `data/BAUMGARTNER/h_vs_t` file-ban találjuk. \n",
"\n",
"A file két oszlopnyi számot tartalmaz. Az első oszlop az idő s-ban, a második oszlop az adott időben mért magasság m-ben. \n",
"Ilyen jellegű egyszerű struktúrájú file-ok beolvasására és az adatok array-ba való töltésére a `numpy` csomag `loadtxt` függvényét használhatjuk:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "TbiqsvYPbv7K",
"colab_type": "code",
"colab": {}
},
"source": [
"baum_data=loadtxt('h_vs_t.txt')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "nc-4dNA7bv7L",
"colab_type": "text"
},
"source": [
"A `baum_data` tömb első oszlopát a a `t` változóba, a második oszlopát pedig a `h` változóba tároljuk:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6_HN5rDsbv7M",
"colab_type": "code",
"colab": {}
},
"source": [
"t=baum_data[:,0] # idő\n",
"h=baum_data[:,1] # magasság"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z4TtdnzYbv7N",
"colab_type": "text"
},
"source": [
"Ábrázoljuk az adatokat! A tengelyfeliratok természetesen nem maradhatnak el!"
]
},
{
"cell_type": "code",
"metadata": {
"id": "rOJq4Rsnbv7N",
"colab_type": "code",
"colab": {},
"outputId": "1696d6e4-0836-42e3-9251-affe62ef142b"
},
"source": [
"plot(t,h)\n",
"xlabel('Ido [s]')\n",
"ylabel('Magassag [m]')"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0, 0.5, 'Magassag [m]')"
]
},
"metadata": {
"tags": []
},
"execution_count": 19
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZEAAAEGCAYAAACkQqisAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deZwU1fX//9fp2ZB9X2RYFUFEFpkIihpFA4hRwCXBmEgSE/wYNWZXk+/vYxb9fGISl+gnmmhccF9QIyEagitxQRlAQURlZJEJCCiLIDIwM+f3R93BFoaZZpye6p55Px+PenTXqVvdp+uhnKm6t26ZuyMiIlIXibgTEBGR7KUiIiIidaYiIiIidaYiIiIidaYiIiIidZYbdwINrWPHjt67d++40xARySrz58//wN077RlvckWkd+/eFBcXx52GiEhWMbNV1cXTfjnLzHLMbKGZzQzrfczsFTNbZmYPmll+iBeE9ZKwvXfSZ1we4m+b2dik+LgQKzGzy9L9W0RE5LMaok/kEmBp0vrVwHXu3g/YBJwX4ucBm9z9YOC60A4zGwhMBg4DxgE3hcKUA/wJOBkYCJwd2oqISANJaxExs0LgFOCvYd2A0cD00GQaMDG8nxDWCdtPDO0nAA+4e5m7rwBKgCPDUuLuy919J/BAaCsiIg0k3Wci1wM/AyrDegdgs7uXh/VSoHt43x1YDRC2bwntd8f32Gdf8b2Y2VQzKzaz4g0bNnze3yQiIkHaioiZfRlY7+7zk8PVNPVatu1vfO+g+y3uXuTuRZ067TW4QERE6iido7NGAaeZ2XigGdCa6MykrZnlhrONQmBNaF8K9ABKzSwXaANsTIpXSd5nX3EREWkAaTsTcffL3b3Q3XsTdYw/4+7nAM8CZ4ZmU4DHw/sZYZ2w/RmPphieAUwOo7f6AP2AV4F5QL8w2is/fMeMdP0eERHZWxz3iVwKPGBmVwILgdtC/DbgbjMrIToDmQzg7kvM7CHgTaAcuNDdKwDM7CJgFpAD3O7uS9KV9J0vrmDT9l3k5Rg5iQS5CSM/N8HBnVtyeGEbWjfLS9dXi4hkLGtqzxMpKiryutxsOOa653ln3bZqtyUMTjy0C+ce1YtjDu5INKhMRKTxMLP57l60Z7zJ3bFeV//64Rdxd8ornYrK6PWTnRUsXfsRL777AdOLS5n95jqO79+JX512GL06tIg7ZRGRtNOZSD0pK6/gnrnvce2/3qbCnT+cNYQvDz6w3r9HRCQO+zoT0Sy+9aQgN4fzjunD0z8+nsMObMNF9y3k2tnv0NSKtIg0LSoi9axrm2bc990RnDW8kBueXsZvn3xLhUREGi31iaRBQW4OvztzMM3ycvjLnOXkJIyfjRsQd1oiIvVORSRNzIxfTziM8spKbnruXfp3bcWEodXOyiIikrV0OSuNokIyiCN7t+fSRxaxZM2WuFMSEalXKiJplpeT4E/nHEG75vmcf/d8Nn28M+6URETqjYpIA+jUqoA/f30467eW8dPpr6ujXUQaDRWRBjKkR1t+OqY/Ty1dz8xFa+NOR0SkXqiINKBvjerN4MI2/HLGEl3WEpFGQUWkAeXmJPjt6YPZ8skurvzH0tp3EBHJcCoiDWzgga05/4t9eWRBKS8s+yDudEREPhcVkRhcPLofPds359czl1BeUVn7DiIiGUpFJAbN8nK47OQBvLNuGw8Vl8adjohInamIxOTkQV0p6tWOa2e/zbay8rjTERGpExWRmJgZvzjlUD7YtpM/P/du3OmIiNRJ2oqImTUzs1fN7HUzW2JmvwrxO81shZm9FpahIW5mdoOZlZjZIjM7IumzppjZsrBMSYoPN7PFYZ8bLMseKTisZztOHXIgt/57OWs2fxJ3OiIi+y2dZyJlwGh3HwIMBcaZ2ciw7afuPjQsr4XYyUC/sEwFbgYws/bAFcAI4EjgCjNrF/a5ObSt2m9cGn9PWvxsbH8q3bnxmZK4UxER2W9pKyIeqXooeV5YaprvYwJwV9hvLtDWzLoBY4HZ7r7R3TcBs4kKUjegtbu/7NE8IncBE9P1e9KlR/vmnH1kTx4uXs2qDz+OOx0Rkf2S1j4RM8sxs9eA9USF4JWw6apwyeo6MysIse7A6qTdS0OspnhpNfHq8phqZsVmVrxhw4bP/bvq20UnHExOwvjjU8viTkVEZL+ktYi4e4W7DwUKgSPNbBBwOTAA+ALQHrg0NK+uP8PrEK8uj1vcvcjdizp16rSfvyL9OrduxpSje/PYa/9h+YZtte8gIpIhGmR0lrtvBp4Dxrn72nDJqgy4g6ifA6IziR5JuxUCa2qJF1YTz0rfPbYvuQnjrpdXxZ2KiEjK0jk6q5OZtQ3vDwBOAt4KfRmEkVQTgTfCLjOAc8MorZHAFndfC8wCxphZu9ChPgaYFbZtNbOR4bPOBR5P1+9Jt06tCvjy4AOZPr+UrTt2xZ2OiEhK0nkm0g141swWAfOI+kRmAvea2WJgMdARuDK0fwJYDpQAtwLfA3D3jcBvwmfMA34dYgAXAH8N+7wLPJnG35N2U47uzbaych6Zr7vYRSQ7WFN7QFJRUZEXFxfHncY+TfzTi3z0yS6e+tEXSSSy6rYXEWnEzGy+uxftGdcd6xnmm0f3ZvkHHzNnWeaNIhMR2ZOKSIYZf3g3OrUqYNpLK+NORUSkVioiGSY/N8E5I3ry7NsbWPGBbj4UkcymIpKBvjaiJ3k5xl0vr4w7FRGRGqmIZKDOrZpxyuHdeLi4VNPEi0hGUxHJUFXDfR9doOG+IpK5VEQy1LCe7RjSoy13vrSSysqmNQxbRLKHikgG++bRvVi+4WNeKPkg7lRERKqlIpLBxh/ejY4tC7hTw31FJEOpiGSwgtwcJn+hB8+9vZ73t+yIOx0Rkb2oiGS4M4cXUunwiDrYRSQDqYhkuN4dW3Bkn/ZMn19KU5vnTEQyn4pIFjhreCErPviY4lWb4k5FROQzVESywPjDu9EiP4eHi1fX3lhEpAGpiGSBFgW5nDK4GzMXreVj3cEuIhlERSRLfKWoB9t3VvDE4rVxpyIispuKSJYY3qsdfTu24OFijdISkcyhIpIlzIwziwp5deVGTREvIhkjbUXEzJqZ2atm9rqZLTGzX4V4HzN7xcyWmdmDZpYf4gVhvSRs7530WZeH+NtmNjYpPi7ESszssnT9lkxxxhGFJAymz1cHu4hkhnSeiZQBo919CDAUGGdmI4GrgevcvR+wCTgvtD8P2OTuBwPXhXaY2UBgMnAYMA64ycxyzCwH+BNwMjAQODu0bbS6tG7Gsf068beFazQpo4hkhLQVEY9sC6t5YXFgNDA9xKcBE8P7CWGdsP1EM7MQf8Ddy9x9BVACHBmWEndf7u47gQdC20bt9CO685/Nn/Dqyo1xpyIikt4+kXDG8BqwHpgNvAtsdveqcaqlQPfwvjuwGiBs3wJ0SI7vsc++4tXlMdXMis2seMOGDfXx02IzZmBXWuTn8NiC/8SdiohIeouIu1e4+1CgkOjM4dDqmoVX28e2/Y1Xl8ct7l7k7kWdOnWqPfEMdkB+DmMHdeWJxWvZsasi7nREpIlrkNFZ7r4ZeA4YCbQ1s9ywqRBYE96XAj0AwvY2wMbk+B777Cve6J0+rJCtZeU8tXRd3KmISBOXztFZncysbXh/AHASsBR4FjgzNJsCPB7ezwjrhO3PeDTj4Axgchi91QfoB7wKzAP6hdFe+USd7zPS9XsyyVEHdaBL6wL+tlCXtEQkXrm1N6mzbsC0MIoqATzk7jPN7E3gATO7ElgI3Bba3wbcbWYlRGcgkwHcfYmZPQS8CZQDF7p7BYCZXQTMAnKA2919SRp/T8bISRgTh3bnthdW8OG2Mjq0LIg7JRFpoqypTS9eVFTkxcXFcafxub31/keMu/7f/Oq0w5hydO+40xGRRs7M5rt70Z5x3bGepQZ0bc2h3VrzqC5piUiMVESy2KRhB/L66s28u2Fb7Y1FRNJARSSLTRjanYTB4zobEZGYqIhksS6tmzHq4I489tp/9OhcEYmFikiWmzSsO6s3fqJH54pILFREstzYw7pyQF4Oj2oaFBGJgYpIlmtRkMvYw7rwj0VrNA2KiDQ4FZFGYNIRhXy0o5zn3l4fdyoi0sSoiDQCow7qQKdWBbqkJSINTkWkEcjNSTBhyIE8+/Z6Nn28M+50RKQJURFpJCYd0Z1dFc7MxWvjTkVEmpB9FhEza5/C0rYhk5V9G9itNf27tOKxBaVxpyIiTUhNs/iuCUt1D3+qkgP0rNeMpE7MjInDunP1P99i1Ycf06tDi7hTEpEmoKbLWUvdva+799nXAnzYUIlK7SYOOxAzeEzToIhIA6mpiByVwv6ptJEG0q3NARzVtwOPLdQ0KCLSMPZZRNx9R9V7M2tnZoPN7IiqZc82khkmDevOqg+3s+C9zXGnIiJNQK2js8zsN8Ai4AbgmrD8Ic15SR2dfHg3muUleGyhOthFJP1SGeL7FeAgdz/e3U8Iy+jadjKzHmb2rJktNbMlZnZJiP/SzP5jZq+FZXzSPpebWYmZvW1mY5Pi40KsxMwuS4r3MbNXzGyZmT0YnrXepLUsyGXMwK7MXLSWneWVcacjIo1cKkXkDaAuQ3nLgR+7+6HASOBCMxsYtl3n7kPD8gRA2DYZOAwYB9xkZjnhGe1/Ak4GBgJnJ33O1eGz+gGbgPPqkGejM2lYdzZv36VpUEQk7VIpIv8LLDSzWWY2o2qpbSd3X+vuC8L7rcBSoHsNu0wAHnD3MndfAZQAR4alxN2Xu/tO4AFggpkZMBqYHvafBkxM4fc0esf260jHlvkapSUiaVfTfSJVphH9xb8YqNP1ETPrDQwDXgFGAReZ2blAMdHZyiaiAjM3abdSPi06q/eIjwA6AJvdvbya9k1abk6C04Z05565q/hwWxkdWhbEnZKINFKpnIl84O43uPuz7v581ZLqF5hZS+AR4Afu/hFwM3AQMBRYS9RRD9Xf1Oh1iFeXw1QzKzaz4g0bNqSaelb72oge7Kyo5KFidbCLSPqkUkTmm9n/mtlRew7xrY2Z5REVkHvd/VEAd1/n7hXuXgncSnS5CqIziR5JuxcS3TG/r/gHQFszy90jvhd3v8Xdi9y9qFOnTqmknvUO7tyKkX3bc+8rq6io1D0jIpIeqRSRYUQd4//DfgzxDX0WtxHd+X5tUrxbUrNJRB33ADOAyWZWYGZ9gH7Aq8A8oF8YiZVP1Pk+w6O76Z4Fzgz7TwEeT+H3NBnfGNmb0k2fMOedpnH2JSINr9Y+EXc/oY6fPQr4BrDYzF4LsZ8Tja4aSnTpaSVwfvieJWb2EPAm0ciuC929AsDMLgJmEc3Vdbu7LwmfdynwgJldCSwkKloSjDmsC51aFXD33FWcMKBz3OmISCO0zyJiZl9295k17VxTG3d/ger7LZ7Y1+e5+1XAVdXEn6huP3dfzqeXw2QPeTkJzv5CD258toTVG7fTo33zuFMSkUampstZvzezYcn9IHsuRJe4JIOdPaInCTPufeW9uFMRkUaopstZ64Bra9gOsKwec5E06NbmAE46tDMPFa/mh1/qR0FuTtwpiUgjss8i4u7HN2AekkbfGNmbWUvW8eTi95k4TLfSiEj90eNxm4CjD+pAn44tuHvuqrhTEZFGRkWkCUgkjHNG9GT+qk0sWbMl7nREpBFREWkizhreg2Z5Ce5+WWcjIlJ/ar1PxMxOrya8BVjs7pomNku0aZ7HpGGFPLKglB+NOYTOrZrFnZKINAKpnImcB/wVOCcstwI/Al40s2+kMTepZ+cf15fyikrueHFl3KmISCORShGpBA519zPc/QyiZ3qUEc2ke2k6k5P61btjC04e1I175q5i645dcacjIo1AKkWkt7uvS1pfDxzi7hsB/UuUZf7riwexdUc598zVzYci8vmlUkT+bWYzzWyKmVVNcjjHzFoAm9ObntS3wwvbcHz/Tvz5+XfZ8on+BhCRzyeVInIhcCfR8z+GAXcRTY748eeYnFFi9LOxA/hoxy5unbM87lREJMulMouvEz2CdnptbSU7DDywNeMHdePOl1bynWP70LZ5ftwpiUiWqvVMxMxGmtk8M9tmZjvNrMLMPmqI5CR9Lj7xYLaVlXP7CyviTkVEslgql7P+DzibaLLFA4DvADemMylJvwFdWzPusK7c8eJKtmxX34iI1E1Kd6y7ewmQEx5rewegvpBG4Psn9mNrWTl/nvNu3KmISJZKpYhsD4+lfc3MfmdmPwRapDkvaQADD2zN6cO6c9sLK1i9cXvc6YhIFkqliHwjtLsI+BjoAZyRzqSk4fxkbH8SBr+b9XbcqYhIFqq1iLj7Knff4e4fATcAd4bLWzUysx5m9qyZLTWzJWZ2SYi3N7PZZrYsvLYLcTOzG8ysxMwWhScnVn3WlNB+WbhXpSo+3MwWh31uMLPqHscrNTiw7QFMPbYvf399DfNXbYo7HRHJMqmMznrOzFqbWXvgdeAOM6vtiYcA5cCP3f1QYCRwoZkNBC4Dnnb3fsDTYR3gZKBfWKYCN4fvbw9cQTTNypHAFVWFJ7SZmrTfuBTykj2c/8WD6NyqgCv/8SbRiG4RkdSkcjmrTTgLOR24w92HAyfVtpO7r3X3BeH9VmAp0B2YAEwLzaYBE8P7CcBdHpkLtDWzbsBYYLa7b3T3TcBsYFzY1trdXw73styV9FmyH1oU5PKTsf1Z+N5mHlnwn7jTEZEskkoRyQ3/YH8FmFmXLzGz3kR3u78CdHH3tRAVGqBzaNYdWJ20W2mI1RQvrSZe3fdPNbNiMyvesGFDXX5Co3fmEYUM79WO/3liKZs+3hl3OiKSJVIpIr8GZgEl7j7PzPoS3TOSEjNrCTwC/CCc0eyzaTUxr0N876D7Le5e5O5FnTp1qi3lJimRMK6aNIiPPtnF/z65NO50RCRLpNKx/rC7D3b374X15WFK+FqZWR5RAbnX3R8N4XXhzIbwWvVgq1KikV9VCoE1tcQLq4lLHQ3o2przju3DQ8WlvLL8w7jTEZEskErH+u9Cx3qemT1tZh+Y2ddT2M+A24Cl7p7cET8DqBphVTUrcFX83DBKaySwJVzumgWMMbN2oUN9DDArbNsapmUx4Nykz5I6uuTEfnRvewC/+NsblJVXxJ2OiGS4VC5njQmXob5M9Nf/IcBPU9hvFNE9JqPN7LWwjAd+C3zJzJYBXwrrAE8Ay4ESoqcnVp35bAR+A8wLy69DDOACoqculgDvAk+mkJfUoHl+LldOGkTJ+m3c+HStI7lFpImrdRZfIC+8jgfud/eNqdyO4e4vUH2/BcCJ1bR3omnnq/us24Hbq4kXA4NqTUb2ywn9O3PGEYXc/Py7jD2sK4cXtok7JRHJUKmcifzdzN4CioCnzawTsCO9aUnc/vvLA+nQIp+fPPw6O3bpspaIVC+VjvXLgKOAInffRTT1yYR0JybxatM8j6vPGMzb67Zyzb80JYqIVC+Vy1kQ3X/xJTNrlhS7Kw35SAY5YUBnvj6yJ7f+ewXH9+/MqIM7xp2SiGSYVEZnXUH0/JAbiaaA/x1wWprzkgzxi/ED6dupBT9+6HU9d0RE9pJKn8iZRB3h77v7t4AhQEFas5KMcUB+Dtd/dSgfbCvj8scWaW4tEfmMVIrIJ+5eCZSbWWuimwP7pjctySSDC9vyk7H9eWLx+9ymx+mKSJJUikixmbUlundjPrAAeDWtWUnGOf+4vow9rAv/++RbvPyu7mYXkUgqo7O+5+6b3f3PRDcHTgmXtaQJMTP+cNYQenVozsX3L+D9LRrlLSKpdawfUbUA7Ylm9T3IzFId2SWNRKtmefzl68PZvrOCC+6dz87yyrhTEpGYpXI56yZgLnAL0SWtl4EHgHfMbEwac5MM1K9LK35/5hAWvreZ38x8M+50RCRmqRSRlcCwMJX6cKLngrxB9GCq36UxN8lQpwzuxtTj+nL33FU8Mr+09h1EpNFKpYgMcPclVSvu/iZRUVmevrQk0/1sbH+O6tuBnz+2mCVrtsSdjojEJJUi8raZ3WxmXwzLTUSXsgoA3X3WROXmJLjxa8No3yKf/7pnvp6GKNJEpVJEvkk01foPgB8STdf+TaICckK6EpPM17FlATedcwTrtpTxnbuK+WSnJmoUaWpSGeL7ibtf4+6T3H2iu//B3be7e6W7b2uIJCVzDevZjj9OHsqC9zZx4X0L2FWhEVsiTUkqQ3z7mdl0M3vTzJZXLQ2RnGSHkw/vxpUTB/HMW+u57JHFmhpFpAlJ5V6PO4ArgOuILl99i30/bEqaqHNG9OKDrTu57ql36Ngyn8vHHxp3SiLSAFLpEznA3Z8GzN1XufsvgdHpTUuy0fdPPJhzj+rFX+Ys55Y578adjog0gFSKyA4zSwDLzOwiM5sEdK5tJzO73czWm9kbSbFfmtl/9njmetW2y82sxMzeNrOxSfFxIVZiZpclxfuY2StmtszMHjSz/JR/taSFmXHFqYdxyuHd+J8n3uLWObrqKdLYpVJEfgA0B74PDAe+AUxJYb87gXHVxK9z96FheQLAzAYCk4HDwj43mVmOmeUAfwJOBgYCZ4e2AFeHz+oHbALOSyEnSbOchHHdV4dyyuHduOqJpVz/1DvqIxFpxGrtE3H3eeHtNqL+kJS4+xwz651i8wnAA+5eBqwwsxLgyLCtpOrGRjN7AJhgZkuJLql9LbSZBvwSuDnV/CR98nMT/HHy0OhZJE8t4+Oycn4+/lDM1JUm0tjss4iY2YyadnT3uj7d8CIzOxcoBn7s7puIHr87N6lNaYgBrN4jPgLoAGx29/Jq2u/FzKYCUwF69uxZx7Rlf+TmJPjdGYNpkZ/Drf9ewcc7K7hywiASCRUSkcakpjORo4j+Ab8feIX6GZF1M/AbwMPrNcC39/HZTvWX27yG9tVy91uIJpCkqKhI11YaSCJh/PK0w2hekMvNz73L9rJy/nDWEHJzUrmKKiLZoKYi0pXo+SFnE102+gdwf/I8WvvL3ddVvTezW4GZYbUU6JHUtBBYE95XF/8AaGtmueFsJLm9ZBAz49JxA2hZkMvvZ73N9p0V3Pi1YRTk5sSdmojUg33+SejuFe7+T3efAowkmvrkOTO7uK5fZmbdklYnEc0GDDADmGxmBWbWB+hH9PTEeUC/MBIrn6jzfYZHPbXPEj3/HaKO/sfrmpek34UnHMwVpw7kX2+u4zvTNEWKSGNRY8d6mGTxFKKzkd7ADcCjqXywmd0PHA90NLNSohsWjzezoUSXnlYC5wO4+xIzewh4EygHLnT3ivA5FwGzgBzg9qQzoUuBB8zsSmAhcFtKv1hi861RfWiRn8tljy5i8q1zufXc4XRu1SzutETkc7B9Db80s2nAIOBJopFTb1TbMMsUFRV5cXFx3Gk0abOWvM8PHniNds3zuHVKEYcd2CbulESkFmY2392L9ozX1MP5DeAQ4BLgJTP7KCxbzeyjdCUqjd/Yw7ry8H8dhQNn/fll/rXk/bhTEpE6qqlPJOHurcLSOmlp5e6tGzJJaXwGdW/D4xeOol+XVpx/z3xufu5d3ZQokoU01lJi07l1Mx6cOpJTDu/G1f98i588vIiycnW4i2STVGbxFUmbZnk53Hj2MA7u3JLrn1rGexs/5qZzhtOpVUHcqYlICnQmIrEzM35w0iHcePYwFv9nC6fe+AIL3tsUd1oikgIVEckYpw45kEcvGEVervHVv7zMPXNXqZ9EJMOpiEhGGXhga/5+0TGMOrgj/+9vb/DT6YvYsUv9JCKZSkVEMk7b5vncPuULfP/EfkyfX8oZN7/E6o3b405LRKqhIiIZKZEwfvSlQ7htShGrN27nlBv+zTNvrat9RxFpUCoiktFOPLQLMy8+lh7tm/PtO4u55l9vU1GpfhKRTKEiIhmvZ4fmPHLB0Xy1qAc3PlPClNtf5cNtZXGnJSKoiEiWaJaXw9VnDuZ3Zwxm3sqNfFnDgEUygoqIZJWvfKEHj1xwNHk5Cb76l5e588UVGgYsEiMVEck6g7q34e8XHcMXD+nEL//+Jhfet4CPduyKOy2RJklFRLJSm+Z53HpuET8fP4BZS9Zx6o0vsGTNlrjTEmlyVEQka5kZU487iAenjmTHrgpOv+klHipeHXdaIk2KiohkvaLe7fnH949leK92/Gz6Iq5/6h0qNQxYpEGkrYiY2e1mtt7M3kiKtTez2Wa2LLy2C3EzsxvMrMTMFpnZEUn7TAntl5nZlKT4cDNbHPa5wcwsXb9FMl/HlgXcfd4IzjiikOufWsa4P85hUenmuNMSafTSeSZyJzBuj9hlwNPu3g94OqwDnAz0C8tU4GaIig7Rs9lHAEcCV1QVntBmatJ+e36XNDE5CeP3Zw7mhrOHsXVHOWfc/BK3zlmusxKRNEpbEXH3OcDGPcITgGnh/TRgYlL8Lo/MBdqaWTdgLDDb3Te6+yZgNjAubGvt7i97NL7zrqTPkiYskTBOG3IgT15yLKMHdOaqJ5byzTvnsWGrbk4USYeG7hPp4u5rAcJr5xDvDiT3iJaGWE3x0mri1TKzqWZWbGbFGzZs+Nw/QjJf2+b5/Pnrw7lq0iBeWf4h466fwyw9y12k3mVKx3p1/Rleh3i13P0Wdy9y96JOnTrVMUXJNmbGOSN68feLj6Frm2acf/d8fvTQa2z5RPeUiNSXhi4i68KlKMLr+hAvBXoktSsE1tQSL6wmLrKXQ7q04rHvjeL7ow/m8dfWMPa6OTy9VDMCi9SHhi4iM4CqEVZTgMeT4ueGUVojgS3hctcsYIyZtQsd6mOAWWHbVjMbGUZlnZv0WSJ7yc9N8KMx/Xn0gqNpc0Ae500r5pIHFrLx451xpyaS1dI5xPd+4GWgv5mVmtl5wG+BL5nZMuBLYR3gCWA5UALcCnwPwN03Ar8B5oXl1yEGcAHw17DPu8CT6fot0ngM6dGWv198DJec2I8nFq/lS9c+z8xFazT/lkgdWVP7n6eoqMiLi4vjTkMywFvvf8Sl0xfxeukWxgzswpUTB9G5dbO40xLJSGY2392L9oxnSse6SIMb0LU1j1xwND8fP4Dn39nASdc+z91zV+mhVyL7QUVEmrTcnARTjzuIf/7gOAZ1b8P/97c3mPCnF44A4mkAAA22SURBVFioZ5WIpERFRATo07EF935nBDeePYwNW8uYdNNLXDp9kZ6gKFILFRGRwMw4dciBPP3j4zn/uL48sqCU0dc8zz26xCWyTyoiIntoWZDL5eMP5clLjuXQbq34f397g0k3vcjrqzWho8ieVERE9qFfl1bc/92R/HHyUNZu2cHEm17k548tZpPuLRHZTUVEpAZmxoSh3Xnmx1/kW0f34cF5qxl9zXPc/+p7usQlgoqISEpaNcvjv08dyMyLj+Hgzi25/NHFnHrjC7yy/MO4UxOJlYqIyH44tFtrHjr/KG48exibt+/kq7fM5cJ7F7B64/a4UxOJhYqIyH5KHsX1w5MO4em31nHitc9zzb/e5uOy8rjTE2lQKiIidXRAfg6XnNSPZ358PCcP6sqNz5Qw+prneGxhqZ6mKE2GiojI53Rg2wP44+RhPHLBUXRp3YwfPvg6p9/8ku56lyZBRUSkngzv1Z6/fW8Uvz9zMP/Z/AmTbnqJHz74mvpLpFFTERGpR4mEcVZRD579yfFccPxB/GPxWk74w3P8csYStu9Uf4k0PpoKXiSN3t+ygxueWcb9r75Hu+b5jBvUlanH9qV3xxZxpyayX/Y1FbyKiEgDeGX5h9z36ns8+cb7lFdUMnFody45qR+9OqiYSHZQEQlURCRO67fu4LZ/r+COl1ays7ySY/t15Nuj+nB8/05ET3oWyUwqIoGKiGSC97fs4MF5q3lg3nus3bKDgd1ac+EJBzNuUFdyEiomknky6smGZrbSzBab2WtmVhxi7c1stpktC6/tQtzM7AYzKzGzRWZ2RNLnTAntl5nZlDh+i0hddG3TjEtO6sfzPz2B3585mB27KrjwvgV86drnuf/V99ixqyLuFEVSEsuZiJmtBIrc/YOk2O+Aje7+WzO7DGjn7pea2XjgYmA8MAL4o7uPMLP2QDFQBDgwHxju7jUOzteZiGSiikrnn2+8z03PlbBkzUd0bJnPuUf15hsje9GuRX7c6Ylk1pnIPkwApoX304CJSfG7PDIXaGtm3YCxwGx33xgKx2xgXEMnLVIfchLGKYO7MfPiY7jvuyM4vHsbrp39Dkf99mmuePwN3WsiGSs3pu914F9m5sBf3P0WoIu7rwVw97Vm1jm07Q6sTtq3NMT2Fd+LmU0FpgL07NmzPn+HSL0yM44+qCNHH9SRd9Zt5dY5y7nv1fe4e+4qTj68G+cf15fBhW3jTlNkt7iKyCh3XxMKxWwze6uGttX1MnoN8b2DUZG6BaLLWfubrEgcDunSit+fNYSfjO3PHS+u5N65q/jHorWM7Nue8487SCO6JCPEcjnL3deE1/XAY8CRwLpwmYrwuj40LwV6JO1eCKypIS7SqHRp3YzLTh7AS5eP5hfjD2XVh9v51p3zGHv9HB4uXk1ZuTrhJT4NXkTMrIWZtap6D4wB3gBmAFUjrKYAj4f3M4BzwyitkcCWcNlrFjDGzNqFkVxjQkykUWrVLI/vHteX5396Atd+ZQgJM346fRHHXP0s//fMMj22V2LR4KOzzKwv0dkHRJfT7nP3q8ysA/AQ0BN4DzjL3TdadL7+f0Sd5tuBb7l71bDgbwM/D591lbvfUdv3a3SWNBbuzgslH3Drv1cw550NNMtLcObwQs47pi99NK2K1DPdbBioiEhj9Pb7W7ntheX8beEadlVWMrp/Z759TB+OPqiD+k2kXqiIBCoi0pht2FrG3XNXcd8rq/hg2076d2nFt0b1ZuKw7jTLy4k7PcliKiKBiog0BTt2VfD319dwx4sreXPtR7RrnsfZR/bk3KN607VNs7jTkyykIhKoiEhT4u68umIjt7+4gn+9uY4cM04+vBvfHtWbYT3bxZ2eZJF9FZG47hMRkQZgZozo24ERfTuweuN2pr20kgfnrebvr69haI+2fPuYPpw8qCt5OZk0eYVkE52JiDQx28rKeWR+KXe8uIKVH26nS+sCzhnRi8lH9qBzK13qkurpclagIiISqax0nntnPdNeWsXz72wgL8cYf3g3zj6yJyP6tNeoLvkMXc4Skc9IJIzRA7owekAXlm/Yxt1zVzG9uJTHX1tDrw7NOX1YIcN7taNFQQ7N8qqWBM1yo/cFuQkSevZJk6czERHZ7ZOdFTz5xloeKl7N3OUba22fn5ugWW7is0UmL4dmuTkU5CXFd7f5NFawx34FuZ++FuQmov3D5+yO5SbIVf9NLHQmIiK1OiA/h9OPKOT0Iwr5cFsZ76zbxo5dFdFSXsGOXZVhvXJ3rGx3LMTLo/dbd5SzYWvZXvEduyo/V465CQtF5tNCVFVgCpKLTt6nseTilFzMPrOem0NBtduiIqjiVT0VERGpVoeWBRzVsqDeP9fdKSuvjIpPKCxV62WhUJWVh1hSkYrW92iza+/YtrJyPty2c3eBS/6cnRV1L2C5CfvMWVPB7kt7CfJzE+Tn5pCfY+TlJMjLiWJ5OYlPY7kJ8nfHP9suP7zPyzHychMUhPZVsYLcBLmJBLlhv9yEkRu25SSMvER8lxZVRESkQZnZ7r/w25DXoN9dWRkVsD3PrHbHdn1ajD77vnKvM6rkorezvJKPPtnFroro/a6KSnZVODsrKveKpUvCiApLUoGpKjxVRWfmxcfU+8wFKiIi0mQkEsYB+TkckB/PFDDuzq4K/0xh2VlVcJLXy6uKUAU7yz0UoErKK5xdleG1opLySqd89+un28orKtlVta3C2VXpVFRWkpuGsxUVERGRBmJm5Oca+bkJWtT/lcJYqKdIRETqTEVERETqTEVERETqTEVERETqLOuLiJmNM7O3zazEzC6LOx8RkaYkq4uImeUAfwJOBgYCZ5vZwHizEhFpOrK6iABHAiXuvtzddwIPABNizklEpMnI9iLSHVidtF4aYp9hZlPNrNjMijds2NBgyYmINHbZfrNhdbdf7jWvgLvfAtwCYGYbzGxVHb+vI/BBHfdt7HRsaqbjs286NjXLlOPTq7pgtheRUqBH0nohsKamHdy9U12/zMyKq5sKWXRsaqPjs286NjXL9OOT7Zez5gH9zKyPmeUDk4EZMeckItJkZPWZiLuXm9lFwCwgB7jd3ZfEnJaISJOR1UUEwN2fAJ5ooK+7pYG+Jxvp2NRMx2ffdGxqltHHp8k9HldEROpPtveJiIhIjFRERESkzlREUqD5ucDMbjez9Wb2RlKsvZnNNrNl4bVdiJuZ3RCO1yIzOyK+zNPPzHqY2bNmttTMlpjZJSGu4wOYWTMze9XMXg/H51ch3sfMXgnH58EwwhIzKwjrJWF77zjzbwhmlmNmC81sZljPmmOjIlILzc+1253AuD1ilwFPu3s/4OmwDtGx6heWqcDNDZRjXMqBH7v7ocBI4MLw34iOT6QMGO3uQ4ChwDgzGwlcDVwXjs8m4LzQ/jxgk7sfDFwX2jV2lwBLk9az5tioiNRO83MB7j4H2LhHeAIwLbyfBkxMit/lkblAWzPr1jCZNjx3X+vuC8L7rUT/GHRHxweA8Du3hdW8sDgwGpge4nsen6rjNh040czq/+HgGcLMCoFTgL+GdSOLjo2KSO1Smp+rieri7msh+ocU6BziTfaYhcsLw4BX0PHZLVyueQ1YD8wG3gU2u3t5aJJ8DHYfn7B9C9ChYTNuUNcDPwMqw3oHsujYqIjULqX5ueQzmuQxM7OWwCPAD9z9o5qaVhNr1MfH3SvcfSjR1ERHAodW1yy8NpnjY2ZfBta7+/zkcDVNM/bYqIjUbr/n52pC1lVdhgmv60O8yR0zM8sjKiD3uvujIazjswd33ww8R9R31NbMqm54Tj4Gu49P2N6GvS+lNhajgNPMbCXRpfLRRGcmWXNsVERqp/m59m0GMCW8nwI8nhQ/N4xCGglsqbqs0xiFa9K3AUvd/dqkTTo+gJl1MrO24f0BwElE/UbPAmeGZnsen6rjdibwjDfSu6Ld/XJ3L3T33kT/tjzj7ueQTcfG3bXUsgDjgXeIruP+Iu58YjoG9wNrgV1Efw2dR3Qt9mlgWXhtH9oa0Yi2d4HFQFHc+af52BxDdElhEfBaWMbr+Ow+PoOBheH4vAH8d4j3BV4FSoCHgYIQbxbWS8L2vnH/hgY6TscDM7Pt2GjaExERqTNdzhIRkTpTERERkTpTERERkTpTERERkTpTERERkTpTERERkTpTERGpR2a2bR/xO83szOq27aP9c+HxA6fV0OarYUrwmXXJVaQ+qIiIZK5z3H2fsyO4+4PAdxowH5G9qIiIpEGY0uT/zOxNM/sHn87gi5mdGB5AtNiih30VpPB53w+ftcjMHkhr8iL7QUVEJD0mAf2Bw4HvAkdD9JQ/ogd8fdXdDwdygQtS+LzLgGHuPhj4r3QkLFIXKiIi6XEccL9HU6CvAZ4J8f7ACnd/J6xPC21rswi418y+TvQkRZGMoCIikj7VTUxX16fQnUI0aeNwYH7SNOEisVIREUmPOcDk8ES/bsAJIf4W0NvMDg7r3wCer+mDzCwB9HD3Z4megNcWaJmetEX2j/6aEUmPx4geMLSY6DECzwO4+w4z+xbwcDibmAf8uZbPygHuMbM2RGcy13n0cCeR2KmIiNQjd28ZXh24aB9tniZ6Dnuqn7mL6JklIhlHl7NEMtNG4M7abjYEbgI2NVhWInvQQ6lERKTOdCYiIiJ1piIiIiJ1piIiIiJ1piIiIiJ19v8DAzC/ajFlg3YAAAAASUVORK5CYII=\n",
"text/plain": [
"