.. _datoteke: Datoteke ======== .. _datoteke_txt: Tekstualne datoteke ------------------- Primjer koji upisuje neka slova i brojeve u datoteku. .. literalinclude:: txt1.py :language: python Rezultat je datoteka: .. literalinclude:: txt1.txt U C-u je običaj štedljivo učitavati ono što je potrebno broj po broj slovo po slovo. U pythonu je običaj učitati odjednom sve a nakon toga analizirati. .. tabularcolumns:: p{ 2.031560398505604in } p{ 2.708747198007472in } p{ 2.031560398505604in } .. list-table:: :header-rows: 0 * - .. literalinclude:: txt2.py :language: python .. literalinclude:: txt2.py.filtered :language: text Sadržaj učitan u jedan veliki string. - .. literalinclude:: txt3.py :language: python .. literalinclude:: txt3.py.filtered :language: text Sadržaj učitan kao lista stringova: jedan red = jedan string. - .. literalinclude:: txt4.py :language: python .. literalinclude:: txt4.py.filtered :language: text Sadržaj učitan kao lista stringova. Zatim svaki red rastavljen u listu stringova. Zadnji element liste pretvaramo u ``float`` i ispisujemo. Ostatak liste ispisujemo kako jest. .. note:: Datoteke se zatvaraju u trenutku napuštanja :keyword:`with` bloka, tj. nakon izvršenja zadnje naredbe u :keyword:`with` bloku. Tekstualni format JSON ^^^^^^^^^^^^^^^^^^^^^^^ JSON omogućuje lagano prebacivanje iz kombinacije dictionary+list+osnovni tipovi u string **i obratno**. Time se lako mogu iz datoteke učitati npr. ulazni podaci za program. .. čestice = [{'rb':1, 'naziv':'prva čestica', 'm':10, 'x':0.0, 'y':0.0}, {'rb':2, 'naziv':'druga čestica', 'm':20, 'x':1.0, 'y':1.1}] .. literalinclude:: txt_json_0.py.filtered :language: pycon U gornjem primjeru smo pomoću :func:`json.dumps` prebacili sadržaj varijable u string. Pomoću :func:`json.dump` sadržaj varijable upisujemo u datoteku. .. literalinclude:: txt_json_x.py :language: python U datoteci je upisano: .. literalinclude:: json1.txt Učitavanje iz stringa radimo pomoću :func:`json.loads` a iz datoteke pomoću :func:`json.load`. .. literalinclude:: txt_json_2.py :language: python .. literalinclude:: txt_json_2.py.filtered :language: text .. _datoteke_bin: Binarne datoteke ----------------- Strukture ^^^^^^^^^^^^^^^^^^^ C interno u memoriji drži samo gole podatke koje je stoga lako direktno prepisati iz memorije u datoteku. Python interno u memoriji drži puno više dodatnih informacija pa je potrebno prije upisa u datoteku izvući same podatke u obliku **liste byteova**. To se radi pomoću funkcije :func:`struct.pack`. .. literalinclude:: structpack01.py.filtered :language: pycon Slijedi primjeri koji upisuju i čitaju riječ, ``int`` i ``double`` u datoteku. .. tabularcolumns:: p{ 3.4689559983395597in } p{ 3.4689559983395597in } .. list-table:: :header-rows: 0 * - .. literalinclude:: bin1.py :language: python .. literalinclude:: bin1.py.filtered :language: text Oznaka ``10sid`` sastoji se od ``10s``, ``i``, ``d``. To znači da će se sastaviti struktura u kojoj će string zauzimati 10 byteova nakon kojih slijede int i double. Pri tome se ubacuje isti *alignment* kao u C-u. Više o oznakama za kodiranje strukture na https://docs.python.org/3/library/struct.html#byte-order-size-and-alignment i na https://docs.python.org/3/library/struct.html#format-characters. Pomoću programa ``hexdump`` možemo vidjeti sadržaj binarnih datoteka. U terminal upišemo ``hexdump bin1.bin`` - .. literalinclude:: bin1.c :language: c .. literalinclude:: bin1.c.filtered :language: text U terminal upišemo ``hexdump bin2.bin``. * - .. literalinclude:: bin1.bin.filtered :language: text Vidimo da je sadržaj datoteke ``bin1.bin`` napravljene iz pythona isti kao datoteke ``bin2.bin`` napravljene iz C-a. - .. literalinclude:: bin2.bin.filtered :language: text * - Učitavanje iz datoteke: .. literalinclude:: bin2.py :language: python .. literalinclude:: bin2.py.filtered :language: text - .. literalinclude:: bin2.c :language: c .. literalinclude:: bin2.c.filtered :language: text Homogena polja ^^^^^^^^^^^^^^^^^^^ Python omogućuje i homogena polja tj. ona koja sadrže elemente istog tipa. Prilikom inicijalizacije potrebno je navesti tip podataka za elemente. .. literalinclude:: bin_array_0.py.filtered :language: pycon .. tabularcolumns:: p{ 3.4689559983395597in } p{ 3.4689559983395597in } .. list-table:: :header-rows: 0 * - Byteove koje definiraju polje možemo dobiti pomoću :meth:`array.tobytes` i nakon toga ih možemo upisati u datoteku. Također je moguće direktno upisivanje iz polja u datoteku pomoću :meth:`array.tofile`. .. literalinclude:: bin_array_1.py :language: python .. literalinclude:: bin_array_1.py.filtered :language: text - .. literalinclude:: bin_array1.c :language: c .. literalinclude:: bin_array1.c.filtered :language: text * - .. literalinclude:: bin_array1.bin.filtered :language: text - .. literalinclude:: bin_array2.bin.filtered :language: text Vidimo da su rezultati prethodnih programa isti. * - Byteove koji definiraju elemente polja možemo interpretirati kao elemente i dodati ih u postojeće polje pomoću :meth:`array.frombytes`. Također je moguće byteove elemenata zapisanih u datoteku pročiti i dodati u postojeće polje pomoću :meth:`array.fromfile`. .. literalinclude:: bin_array_2.py :language: python .. literalinclude:: bin_array_2.py.filtered :language: text - .. literalinclude:: bin_array2.c :language: c .. literalinclude:: bin_array2.c.filtered :language: text