{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Algoritmusok Python nyelven\n", "\n", "## 5. Előadás: Fájlok írása és olvasása\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A legfontosabb operációk:\n", "\n", "- az `open('fajlnev','r')` parancs megnyitva a fajlnev nevű fájlt olvasásra és visszatért a file objektummal\n", "- az `open('fajlnev','w')` parancs megnyitva a fajlnev nevű fájlt írásra és visszatért a file objektummal\n", "- a `fajlobjektum.close()` parancs lezárja a fájlt, akár írtunk bele akár olvastunk \n", "\n", "A következő példa fájlt fogjuk használni, amit a `pelda_fajl.txt`-be mentettem:" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "1,Donielle,Vickar,dvickar0@tmall.com,true\n", "2,Perle,Claye,pclaye1@blogs.com,true\n", "3,Flori,Wharf,fwharf2@zdnet.com,true\n", "4,Kristen,Haryngton,kharyngton3@yelp.com,false\n", "5,Bibby,Covill,bcovill4@psu.edu,true\n", "6,Illa,D'Elias,idelias5@twitter.com,true\n", "7,Genia,Woodyear,gwoodyear6@reuters.com,false\n", "8,Patrice,Rhys,prhys7@meetup.com,false\n", "9,Rich,Gavozzi,rgavozzi8@istockphoto.com,false\n", "10,Elfie,Comben,ecomben9@un.org,true" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fájl beolvasása \n", "\n", "Egy sort beolvashatunk a `.readline()` függvénnyel: \n", "- Beolvassa a whitepsaceket, például a sorvégi új sor karatert is! \n", "- A következő sorra lép, tehát többszöri meghívás esetén végighalad a fájlon.\n", "- A fájl végén hibát jelez, így használható egy while ciklusban" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "1,Donielle,Vickar,dvickar0@tmall.com,true\n", "\n", "2,Perle,Claye,pclaye1@blogs.com,true\n", "\n", "'2,Perle,Claye,pclaye1@blogs.com,true\\n'\n" ] } ], "source": [ "fajlobj = open(\"pelda_fajl.txt\", \"r\")\n", "print(type(fajlobj))\n", "line=fajlobj.readline()\n", "print(line)\n", "line=fajlobj.readline()\n", "print(line)\n", "print(repr(line))\n", "fajlobj.close()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Donielle Vickar emailcíme: dvickar0@tmall.com\n", "Perle Claye emailcíme: pclaye1@blogs.com\n", "Flori Wharf emailcíme: fwharf2@zdnet.com\n", "Kristen Haryngton emailcíme: kharyngton3@yelp.com\n", "Bibby Covill emailcíme: bcovill4@psu.edu\n", "Illa D'Elias emailcíme: idelias5@twitter.com\n", "Genia Woodyear emailcíme: gwoodyear6@reuters.com\n", "Patrice Rhys emailcíme: prhys7@meetup.com\n", "Rich Gavozzi emailcíme: rgavozzi8@istockphoto.com\n", "Elfie Comben emailcíme: ecomben9@un.org\n" ] } ], "source": [ "fajlobj = open(\"pelda_fajl.txt\", \"r\")\n", "line=fajlobj.readline()\n", "while line:\n", " values = line.strip().split(\",\")\n", " print(values[1]+\" \"+values[2]+\" emailcíme: \"+values[3])\n", " line=fajlobj.readline()\n", "fajlobj.close()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Egy fájlon a for ciklus segítségével is végighaladhatunk:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['1', 'Donielle', 'Vickar', 'dvickar0@tmall.com', 'true']\n", "['2', 'Perle', 'Claye', 'pclaye1@blogs.com', 'true']\n", "['3', 'Flori', 'Wharf', 'fwharf2@zdnet.com', 'true']\n", "['4', 'Kristen', 'Haryngton', 'kharyngton3@yelp.com', 'false']\n", "['5', 'Bibby', 'Covill', 'bcovill4@psu.edu', 'true']\n", "['6', 'Illa', \"D'Elias\", 'idelias5@twitter.com', 'true']\n", "['7', 'Genia', 'Woodyear', 'gwoodyear6@reuters.com', 'false']\n", "['8', 'Patrice', 'Rhys', 'prhys7@meetup.com', 'false']\n", "['9', 'Rich', 'Gavozzi', 'rgavozzi8@istockphoto.com', 'false']\n", "['10', 'Elfie', 'Comben', 'ecomben9@un.org', 'true']\n" ] } ], "source": [ "fajlobj = open(\"pelda_fajl.txt\", \"r\")\n", "\n", "for line in fajlobj:\n", " values = line.strip().split(\",\")\n", " print(values)\n", "\n", "fajlobj.close()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Egyéb lehetőségek:\n", "- `fajlobj.read(n)` beolvas n karaktert, vagy ha paraméter nélkül hívjuk az egész fájlt. \n", "- `fajlobj.readlines()` visszaadja a fájl sorait egy listában. \n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1,Donielle,Vickar,dvickar0@tmall.com,true\n", "2,Perle,Claye,pclaye1@blogs.com,true\n", "3,Flori,Wharf,fwharf2@zdnet.com,true\n", "4,Kristen,Haryngton,kharyngton3@yelp.com,false\n", "5,Bibby,Covill,bcovill4@psu.edu,true\n", "6,Illa,D'Elias,idelias5@twitter.com,true\n", "7,Genia,Woodyear,gwoodyear6@reuters.com,false\n", "8,Patrice,Rhys,prhys7@meetup.com,false\n", "9,Rich,Gavozzi,rgavozzi8@istockphoto.com,false\n", "10,Elfie,Comben,ecomben9@un.org,true\n", "\"1,Donielle,Vickar,dvickar0@tmall.com,true\\n2,Perle,Claye,pclaye1@blogs.com,true\\n3,Flori,Wharf,fwharf2@zdnet.com,true\\n4,Kristen,Haryngton,kharyngton3@yelp.com,false\\n5,Bibby,Covill,bcovill4@psu.edu,true\\n6,Illa,D'Elias,idelias5@twitter.com,true\\n7,Genia,Woodyear,gwoodyear6@reuters.com,false\\n8,Patrice,Rhys,prhys7@meetup.com,false\\n9,Rich,Gavozzi,rgavozzi8@istockphoto.com,false\\n10,Elfie,Comben,ecomben9@un.org,true\"\n" ] } ], "source": [ "fajlobj = open(\"pelda_fajl.txt\", \"r\")\n", "\n", "tartalom=fajlobj.read()\n", "print(tartalom)\n", "print(repr(tartalom))\n", "\n", "fajlobj.close()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fájlok írása\n", "\n", " A `fajlobj.write(egy_string)` parancs a fájl végére írja a megadott stringet. Ehhez a fajlobj-nak egy írásra megnyitott fájlnak kell lennie.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ezt találtam a fájlban: Na ezt most kiírom egy fájlba!\n" ] } ], "source": [ "fajlirni = open(\"pelda_fajl_irni.txt\", \"w\") # ha nem létezik a fájl létrehozza azt. \n", "\n", "fajlirni.write(\"Na ezt most kiírom egy fájlba!\")\n", "\n", "fajlirni.close()\n", "\n", "fajlolvasni = open(\"pelda_fajl_irni.txt\", \"r\") \n", "tartalom=fajlolvasni.read()\n", "print(\"Ezt találtam a fájlban: \" + tartalom)\n", "fajlolvasni.close()\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Hibalehetőségek" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Miért kell lezárni egy fájlt?\n", "Ha nem zárjuk be, gondokat okozhat, hogy korábbi operációk még nem hajtódtak végre. Például: " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ezt találtam a fájlban: Na ezt most kiírom egy fájlba!\n" ] } ], "source": [ "fajlirni = open(\"pelda_fajl_irni.txt\", \"w\") \n", "\n", "fajlirni.write(\"Na eztfdfddf most kiírom egy fájlba!\")\n", "\n", "\n", "fajlolvasni = open(\"pelda_fajl_irni.txt\", \"r\") \n", "tartalom=fajlolvasni.read()\n", "print(\"Ezt találtam a fájlban: \" + tartalom)\n", "fajlolvasni.close()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## with kulcsszó\n", "A `with` kulcsszó automatikusan megoldja nekünk a lezárást és a hibakezelést. Használat:\n", "\n", "`with open(argumentumok) as valtozonev:`\n", " \n", " kód indentálva\n", "\n", "Ha sikerül megnyitni a fájlt, lefuttatja az indentált részt, majd meghívja helyettünk a close() parancsot." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ezt találtam a fájlban: Na ezt most kiírom egy fájlba!ájlba!\n" ] } ], "source": [ "with open(\"pelda_fajl_irni.txt\", \"w\") as fajlirni:\n", " fajlirni.write(\"Na ezt most kiírom egy fájlba!\")\n", " \n", "\n", "with open(\"pelda_fajl_irni.txt\", \"r\") as fajlolvasni:\n", " tartalom=fajlolvasni.read()\n", " print(\"Ezt találtam a fájlban: \" + tartalom)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### A hibák elkerülése végett, ez az ajánlott módszer!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Karakterkódolás\n", "- Több féle karakterkódolás is létezik. \n", "- Néha meg kell mondani a Pythonnak, hogy melyiket használja, különben rosszul értelmezi a fájlt.\n", "- Leggyakoribbak: utf-8 és latin-1" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ezt találtam a fájlban: árvĂ­ztűrĹ‘ tĂĽkörfĂşrĂłgĂ©p\n" ] } ], "source": [ "with open(\"pelda_fajl_irni.txt\", \"w\", encoding='utf-8') as fajlirni:\n", " fajlirni.write(\"árvíztűrő tükörfúrógép\")\n", "\n", "with open(\"pelda_fajl_irni.txt\", \"r\") as fajlolvasni:\n", " tartalom=fajlolvasni.read()\n", " print(\"Ezt találtam a fájlban: \" + tartalom)\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ezt találtam a fájlban: árvíztűrő tükörfúrógép\n" ] } ], "source": [ "with open(\"pelda_fajl_irni.txt\", \"w\", encoding='utf-8') as fajlirni:\n", " fajlirni.write(\"árvíztűrő tükörfúrógép\")\n", "\n", "with open(\"pelda_fajl_irni.txt\", \"r\",encoding='utf-8') as fajlolvasni:\n", " tartalom=fajlolvasni.read()\n", " print(\"Ezt találtam a fájlban: \" + tartalom)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### json (JavaScript Object Notation)\n", "- a json egy fájl formátum, ami nagyon elterjedt, főleg web programozásban. \n", "- a dictionary-k kiírására és beolvasására kényelmesen használható\n", "- Kiírás: `json.dump(data, outfile)`, beolvasás: `json.load(json_file)`" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import json \n", "\n", "data = {}\n", "data['sárkányok'] = []\n", "data['sárkányok'].append({\n", " 'nev': 'Süsü',\n", " 'támadás': 'ölelés',\n", " 'lakhely': 'Magyarország'\n", "})\n", "data['sárkányok'].append({\n", " 'nev': 'Smaug',\n", " 'támadás': 'tűzokádás',\n", " 'lakhely': 'Középfölde'\n", "})\n", "data['sárkányok'].append({\n", " 'nev': 'Rhaegal',\n", " 'támadás': 'tűzokádás',\n", " 'lakhely': 'Westeros'\n", "})\n", "\n", "with open('data.txt', 'w') as outfile:\n", " json.dump(data, outfile)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Név: Süsü\n", "Támadás: ölelés\n", "Lakóhely: Magyarország\n", "\n", "Név: Smaug\n", "Támadás: tűzokádás\n", "Lakóhely: Középfölde\n", "\n", "Név: Rhaegal\n", "Támadás: tűzokádás\n", "Lakóhely: Westeros\n", "\n" ] } ], "source": [ "import json\n", "\n", "with open('data.txt') as json_file:\n", " adat = json.load(json_file)\n", " for p in adat['sárkányok']:\n", " print('Név: ' + p['nev'])\n", " print('Támadás: ' + p['támadás'])\n", " print('Lakóhely: ' + p['lakhely'])\n", " print('')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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" } }, "nbformat": 4, "nbformat_minor": 2 }