{"id":1513,"date":"2026-04-14T15:21:50","date_gmt":"2026-04-14T13:21:50","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1513"},"modified":"2026-04-28T15:28:43","modified_gmt":"2026-04-28T13:28:43","slug":"open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/14\/open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu\/","title":{"rendered":"Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Praca z plikami jest jednym z podstawowych element\u00f3w programowania, niezale\u017cnie od j\u0119zyka. Dane rzadko istniej\u0105 wy\u0142\u0105cznie w pami\u0119ci operacyjnej \u2014 trzeba je zapisa\u0107 do raportu, odczyta\u0107 konfiguracj\u0119, przetworzy\u0107 logi albo pobra\u0107 dane wej\u015bciowe z pliku CSV, JSON czy zwyk\u0142ego tekstu. W praktyce b\u0142\u0119dy przy operacjach plikowych kosztuj\u0105 najwi\u0119cej czasu, bo cz\u0119sto prowadz\u0105 do utraty danych albo trudnych do wykrycia problem\u00f3w z kodowaniem znak\u00f3w. Podstaw\u0105 tego mechanizmu jest funkcja Open.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu-w-praktyce-pracy-z-danymi-tekstowymi-i-binarnymi\">Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu w praktyce pracy z danymi tekstowymi i binarnymi<\/a><ol><li><a href=\"#co-dokladnie-zwraca-funkcja-open\">Co dok\u0142adnie zwraca funkcja open<\/a><\/li><li><a href=\"#przyklady-podstawowego-otwierania-pliku\">Przyk\u0142ady podstawowego otwierania pliku<\/a><\/li><\/ol><\/li><li><a href=\"#open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu-oraz-znaczenie-trybow-pracy-i-kodowania-znakow\">Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu oraz znaczenie tryb\u00f3w pracy i kodowania znak\u00f3w<\/a><ol><li><a href=\"#najwazniejsze-tryby-pracy\">Najwa\u017cniejsze tryby pracy<\/a><\/li><li><a href=\"#odczyt-tekstu\">Odczyt tekstu<\/a><\/li><li><a href=\"#zapis-tekstu\">Zapis tekstu<\/a><\/li><li><a href=\"#kodowanie-znakow-i-realny-problem-z-polskimi-literami\">Kodowanie znak\u00f3w i realny problem z polskimi literami<\/a><\/li><\/ol><\/li><li><a href=\"#operacje-na-pozycji-kursora-i-roznica-miedzy-odczytem-sekwencyjnym-a-losowym\">Operacje na pozycji kursora i r\u00f3\u017cnica mi\u0119dzy odczytem sekwencyjnym a losowym<\/a><ol><li><a href=\"#najwazniejsze-metody\">Najwa\u017cniejsze metody<\/a><\/li><li><a href=\"#przyklad\">Przyk\u0142ad<\/a><\/li><\/ol><\/li><li><a href=\"#open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu-a-najczestsze-bledy-prowadzace-do-utraty-danych\">Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu a najcz\u0119stsze b\u0142\u0119dy prowadz\u0105ce do utraty danych<\/a><ol><li><a href=\"#blad-pierwszy-uzycie-trybu-w-zamiast-a\">B\u0142\u0105d pierwszy: u\u017cycie trybu w zamiast a<\/a><\/li><li><a href=\"#blad-drugi-brak-zamkniecia-pliku\">B\u0142\u0105d drugi: brak zamkni\u0119cia pliku<\/a><\/li><li><a href=\"#blad-trzeci-zalozenie-ze-plik-zawsze-istnieje\">B\u0142\u0105d trzeci: za\u0142o\u017cenie, \u017ce plik zawsze istnieje<\/a><\/li><li><a href=\"#blad-czwarty-praca-na-sciezkach-wzglednych-bez-kontroli-katalogu-roboczego\">B\u0142\u0105d czwarty: praca na \u015bcie\u017ckach wzgl\u0119dnych bez kontroli katalogu roboczego<\/a><\/li><\/ol><\/li><li><a href=\"#wzory-i-zaleznosci-uzywane-przy-analizie-operacji-wejscia-i-wyjscia\">Wzory i zale\u017cno\u015bci u\u017cywane przy analizie operacji wej\u015bcia i wyj\u015bcia<\/a><\/li><li><a href=\"#uwagi-praktyczne-z-codziennej-pracy\">Uwagi praktyczne z codziennej pracy<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-open-tworzy-plik-automatycznie\">Czy open() tworzy plik automatycznie?<\/a><\/li><li><a href=\"#dlaczego-with-open-jest-lepsze-niz-zwykle-open\">Dlaczego with open() jest lepsze ni\u017c zwyk\u0142e open()?<\/a><\/li><li><a href=\"#kiedy-uzywac-trybu-binarnego-b\">Kiedy u\u017cywa\u0107 trybu binarnego b?<\/a><\/li><li><a href=\"#czy-write-dopisuje-nowa-linie-automatycznie\">Czy write() dopisuje now\u0105 lini\u0119 automatycznie?<\/a><\/li><li><a href=\"#czy-mozna-jednoczesnie-czytac-i-pisac-do-tego-samego-pliku\">Czy mo\u017cna jednocze\u015bnie czyta\u0107 i pisa\u0107 do tego samego pliku?<\/a><\/li><li><a href=\"#dlaczego-pojawia-sie-unicode-decode-error\">Dlaczego pojawia si\u0119 UnicodeDecodeError?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu-w-praktyce-pracy-z-danymi-tekstowymi-i-binarnymi\">Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu w praktyce pracy z danymi tekstowymi i binarnymi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>open()<\/code> w Pythonie s\u0142u\u017cy do nawi\u0105zania po\u0142\u0105czenia programu z plikiem znajduj\u0105cym si\u0119 na dysku. Sam plik fizycznie istnieje w systemie operacyjnym, natomiast program otrzymuje tzw. obiekt pliku, czyli uchwyt pozwalaj\u0105cy wykonywa\u0107 operacje wej\u015bcia i wyj\u015bcia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To rozr\u00f3\u017cnienie jest wa\u017cne. Program nie \u201epracuje na nazwie pliku\u201d, tylko na obiekcie zwr\u00f3conym przez funkcj\u0119. Nazwa jest tylko adresem, a obiekt jest narz\u0119dziem operacyjnym.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142adowo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>plik mo\u017ce by\u0107 otwarty do odczytu<\/li>\n\n\n\n<li>plik mo\u017ce by\u0107 otwarty do zapisu<\/li>\n\n\n\n<li>plik mo\u017ce by\u0107 otwarty do dopisywania<\/li>\n\n\n\n<li>plik mo\u017ce by\u0107 traktowany jako tekst<\/li>\n\n\n\n<li>plik mo\u017ce by\u0107 traktowany jako dane binarne<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">System operacyjny pilnuje tak\u017ce blokad, uprawnie\u0144 i aktualnej pozycji kursora w pliku.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi program otwiera plik, ale go nie zamyka, mo\u017ce doj\u015b\u0107 do:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>utraty cz\u0119\u015bci danych<\/li>\n\n\n\n<li>zablokowania pliku przez proces<\/li>\n\n\n\n<li>wyciek\u00f3w zasob\u00f3w systemowych<\/li>\n\n\n\n<li>problem\u00f3w przy pracy wielow\u0105tkowej<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego poprawne zarz\u0105dzanie plikiem jest wa\u017cniejsze ni\u017c sama sk\u0142adnia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"co-dokladnie-zwraca-funkcja-open\">Co dok\u0142adnie zwraca funkcja open<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zwracany obiekt posiada metody takie jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>read()<\/code><\/li>\n\n\n\n<li><code>readline()<\/code><\/li>\n\n\n\n<li><code>readlines()<\/code><\/li>\n\n\n\n<li><code>write()<\/code><\/li>\n\n\n\n<li><code>writelines()<\/code><\/li>\n\n\n\n<li><code>close()<\/code><\/li>\n\n\n\n<li><code>seek()<\/code><\/li>\n\n\n\n<li><code>tell()<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To w\u0142a\u015bnie te metody wykonuj\u0105 w\u0142a\u015bciw\u0105 prac\u0119.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklady-podstawowego-otwierania-pliku\">Przyk\u0142ady podstawowego otwierania pliku<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>plik = open(\"dane.txt\", \"r\", encoding=\"utf-8\")<\/code><\/td><\/tr><tr><td>C<\/td><td><code>FILE *plik = fopen(\"dane.txt\", \"r\");<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>ifstream plik(\"dane.txt\");<\/code><\/td><\/tr><tr><td>PHP<\/td><td><code>$plik = fopen(\"dane.txt\", \"r\");<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie parametr <code>encoding<\/code> ma du\u017ce znaczenie. Bez niego system mo\u017ce u\u017cy\u0107 domy\u015blnego kodowania, kt\u00f3re r\u00f3\u017cni si\u0119 mi\u0119dzy Windows, Linux i macOS. To cz\u0119sta przyczyna b\u0142\u0119d\u00f3w z polskimi znakami.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu-oraz-znaczenie-trybow-pracy-i-kodowania-znakow\">Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu oraz znaczenie tryb\u00f3w pracy i kodowania znak\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi argument funkcji okre\u015bla tryb pracy. To on decyduje, czy plik b\u0119dzie tylko czytany, nadpisywany czy rozszerzany o nowe dane.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Niepoprawny tryb to jedna z najcz\u0119stszych przyczyn przypadkowego usuni\u0119cia zawarto\u015bci pliku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"najwazniejsze-tryby-pracy\">Najwa\u017cniejsze tryby pracy<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tryb<\/th><th>Znaczenie<\/th><th>Zachowanie<\/th><\/tr><\/thead><tbody><tr><td><code>r<\/code><\/td><td>odczyt<\/td><td>plik musi istnie\u0107<\/td><\/tr><tr><td><code>w<\/code><\/td><td>zapis<\/td><td>tworzy nowy lub kasuje stary<\/td><\/tr><tr><td><code>a<\/code><\/td><td>dopisywanie<\/td><td>dopisuje na ko\u0144cu<\/td><\/tr><tr><td><code>x<\/code><\/td><td>utworzenie nowego<\/td><td>b\u0142\u0105d je\u015bli plik istnieje<\/td><\/tr><tr><td><code>rb<\/code><\/td><td>odczyt binarny<\/td><td>np. obraz, PDF<\/td><\/tr><tr><td><code>wb<\/code><\/td><td>zapis binarny<\/td><td>nadpisuje plik binarny<\/td><\/tr><tr><td><code>r+<\/code><\/td><td>odczyt i zapis<\/td><td>plik musi istnie\u0107<\/td><\/tr><tr><td><code>a+<\/code><\/td><td>odczyt i dopisywanie<\/td><td>kursor na ko\u0144cu<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tryb <code>w<\/code> jest szczeg\u00f3lnie niebezpieczny. Je\u017celi plik istnieje, jego zawarto\u015b\u0107 zostaje wyczyszczona natychmiast po otwarciu \u2014 nawet je\u015bli program p\u00f3\u017aniej zako\u0144czy si\u0119 b\u0142\u0119dem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"odczyt-tekstu\">Odczyt tekstu<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>with open(\"raport.txt\", \"r\", encoding=\"utf-8\") as plik:\\n tresc = plik.read()<\/code><\/td><\/tr><tr><td>C<\/td><td><code>char tekst[100];\\nFILE *plik = fopen(\"raport.txt\", \"r\");\\nfgets(tekst, 100, plik);<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>string linia;\\nifstream plik(\"raport.txt\");\\ngetline(plik, linia);<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Instrukcja <code>with<\/code> w Pythonie jest najlepsz\u0105 praktyk\u0105. Po zako\u0144czeniu bloku plik zamyka si\u0119 automatycznie, nawet je\u015bli wyst\u0105pi wyj\u0105tek.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zapis-tekstu\">Zapis tekstu<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>with open(\"wynik.txt\", \"w\", encoding=\"utf-8\") as plik:\\n plik.write(\"Ala ma kota\")<\/code><\/td><\/tr><tr><td>C<\/td><td><code>FILE *plik = fopen(\"wynik.txt\", \"w\");\\nfprintf(plik, \"Ala ma kota\");<\/code><\/td><\/tr><tr><td>PHP<\/td><td><code>$plik = fopen(\"wynik.txt\", \"w\");\\nfwrite($plik, \"Ala ma kota\");<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kodowanie-znakow-i-realny-problem-z-polskimi-literami\">Kodowanie znak\u00f3w i realny problem z polskimi literami<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi plik zapisano w UTF-8, a program odczytuje go jako ANSI lub Latin-2, pojawi\u0105 si\u0119 b\u0142dy typu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>UnicodeDecodeError<\/code><\/li>\n\n\n\n<li>nieczytelne znaki: <code>\u00c4\u2026<\/code>, <code>\u00c5\u203a<\/code>, <code>\u00c3\u00b3<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W \u015brodowiskach produkcyjnych taki b\u0142\u0105d potrafi zepsu\u0107 import faktur, raport\u00f3w lub danych klient\u00f3w. Dlatego warto jawnie ustawia\u0107:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parametr<\/th><th>Zalecenie<\/th><\/tr><\/thead><tbody><tr><td><code>encoding<\/code><\/td><td><code>utf-8<\/code><\/td><\/tr><tr><td><code>newline<\/code><\/td><td>kontrolowany zapis ko\u0144ca linii<\/td><\/tr><tr><td><code>errors<\/code><\/td><td>np. <code>ignore<\/code> lub <code>replace<\/code> tylko \u015bwiadomie<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"operacje-na-pozycji-kursora-i-roznica-miedzy-odczytem-sekwencyjnym-a-losowym\">Operacje na pozycji kursora i r\u00f3\u017cnica mi\u0119dzy odczytem sekwencyjnym a losowym<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Po otwarciu pliku system ustawia wska\u017anik pozycji, czyli miejsce, z kt\u00f3rego nast\u0105pi kolejny odczyt lub zapis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To dzia\u0142a podobnie jak zak\u0142adka w ksi\u0105\u017cce \u2014 program pami\u0119ta, gdzie aktualnie si\u0119 znajduje.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"najwazniejsze-metody\">Najwa\u017cniejsze metody<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metoda<\/th><th>Dzia\u0142anie<\/th><\/tr><\/thead><tbody><tr><td><code>tell()<\/code><\/td><td>zwraca aktualn\u0105 pozycj\u0119<\/td><\/tr><tr><td><code>seek()<\/code><\/td><td>przeskakuje do wskazanego miejsca<\/td><\/tr><tr><td><code>read(n)<\/code><\/td><td>czyta okre\u015blon\u0105 liczb\u0119 znak\u00f3w lub bajt\u00f3w<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad\">Przyk\u0142ad<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod Python<\/th><\/tr><\/thead><tbody><tr><td><code>with open(\"dane.txt\", \"r\", encoding=\"utf-8\") as plik:\\n print(plik.tell())\\n fragment = plik.read(5)\\n print(plik.tell())\\n plik.seek(0)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Po <code>read(5)<\/code> wska\u017anik przesuwa si\u0119 dalej. Przy du\u017cych plikach log\u00f3w takie sterowanie jest konieczne, bo nie zawsze op\u0142aca si\u0119 \u0142adowa\u0107 ca\u0142y plik do pami\u0119ci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla pliku 5 GB u\u017cycie <code>read()<\/code> bez ogranicze\u0144 mo\u017ce zako\u0144czy\u0107 proces przez brak pami\u0119ci RAM. Odczyt liniowy lub blokowy jest wtedy jedynym rozs\u0105dnym rozwi\u0105zaniem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"open-otwiera-plik-i-zwraca-obiekt-pliku-do-odczytu-lub-zapisu-a-najczestsze-bledy-prowadzace-do-utraty-danych\">Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu a najcz\u0119stsze b\u0142\u0119dy prowadz\u0105ce do utraty danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najwi\u0119cej problem\u00f3w nie wynika z samej funkcji, tylko z nieuwa\u017cnego u\u017cycia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"blad-pierwszy-uzycie-trybu-w-zamiast-a\">B\u0142\u0105d pierwszy: u\u017cycie trybu <code>w<\/code> zamiast <code>a<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To klasyczny przypadek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Administrator dopisuje logi, ale przez pomy\u0142k\u0119 u\u017cywa <code>w<\/code>. Program uruchamia si\u0119 raz i ca\u0142y wcze\u015bniejszy plik znika.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"blad-drugi-brak-zamkniecia-pliku\">B\u0142\u0105d drugi: brak zamkni\u0119cia pliku<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad z\u0142ej praktyki:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod Python<\/th><\/tr><\/thead><tbody><tr><td><code>plik = open(\"log.txt\", \"w\")\\nplik.write(\"test\")<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Brakuje <code>close()<\/code> albo <code>with<\/code>. Przy kr\u00f3tkim skrypcie mo\u017ce \u201edzia\u0142a\u0107\u201d, ale w systemie produkcyjnym to proszenie si\u0119 o problemy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poprawnie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod Python<\/th><\/tr><\/thead><tbody><tr><td><code>with open(\"log.txt\", \"w\", encoding=\"utf-8\") as plik:\\n plik.write(\"test\")<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"blad-trzeci-zalozenie-ze-plik-zawsze-istnieje\">B\u0142\u0105d trzeci: za\u0142o\u017cenie, \u017ce plik zawsze istnieje<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Programy powinny zak\u0142ada\u0107 awari\u0119, nie idealne warunki.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017ce wyst\u0105pi\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>brak pliku<\/li>\n\n\n\n<li>brak uprawnie\u0144<\/li>\n\n\n\n<li>zaj\u0119ty plik<\/li>\n\n\n\n<li>uszkodzony system plik\u00f3w<\/li>\n\n\n\n<li>nieprawid\u0142owa \u015bcie\u017cka<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego potrzebna jest obs\u0142uga wyj\u0105tk\u00f3w.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod Python<\/th><\/tr><\/thead><tbody><tr><td><code>try:\\n with open(\"dane.txt\", \"r\", encoding=\"utf-8\") as plik:\\n print(plik.read())\\nexcept FileNotFoundError:\\n print(\"Plik nie istnieje\")<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"blad-czwarty-praca-na-sciezkach-wzglednych-bez-kontroli-katalogu-roboczego\">B\u0142\u0105d czwarty: praca na \u015bcie\u017ckach wzgl\u0119dnych bez kontroli katalogu roboczego<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>dane.txt<\/code> mo\u017ce oznacza\u0107 r\u00f3\u017cne miejsca w zale\u017cno\u015bci od tego, sk\u0105d uruchomiono program.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bezpieczniej u\u017cywa\u0107 pe\u0142nych \u015bcie\u017cek albo modu\u0142u <code>pathlib<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wzory-i-zaleznosci-uzywane-przy-analizie-operacji-wejscia-i-wyjscia\">Wzory i zale\u017cno\u015bci u\u017cywane przy analizie operacji wej\u015bcia i wyj\u015bcia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Operacje plikowe analizuje si\u0119 r\u00f3wnie\u017c pod k\u0105tem kosztu czasowego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przybli\u017cony czas odczytu zale\u017cy od rozmiaru danych i przepustowo\u015bci no\u015bnika.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wz\u00f3r<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td><code>t = \\frac{d}{v}<\/code><\/td><td>czas odczytu = dane \/ pr\u0119dko\u015b\u0107 no\u015bnika<\/td><\/tr><tr><td><code>RAM &gt; rozmiar\\ pliku<\/code><\/td><td>pe\u0142ny odczyt do pami\u0119ci ma sens tylko przy odpowiedniej pami\u0119ci<\/td><\/tr><tr><td><code>O(n)<\/code><\/td><td>odczyt sekwencyjny ca\u0142ego pliku<\/td><\/tr><tr><td><code>O(1)<\/code> lub <code>O(log n)<\/code><\/td><td>dost\u0119p indeksowany zale\u017cnie od struktury danych<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dla SSD o realnym odczycie 500 MB\/s plik 2 GB b\u0119dzie \u0142adowany oko\u0142o 4 sekundy, bez uwzgl\u0119dnienia op\u00f3\u017anie\u0144 systemowych i obci\u0105\u017cenia procesora.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"uwagi-praktyczne-z-codziennej-pracy\">Uwagi praktyczne z codziennej pracy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi kod pracuje na raportach finansowych, backupach albo plikach klient\u00f3w, nie warto ufa\u0107 domy\u015blnym ustawieniom.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobrze jest:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>jawnie podawa\u0107 <code>encoding<\/code><\/li>\n\n\n\n<li>u\u017cywa\u0107 <code>with<\/code><\/li>\n\n\n\n<li>testowa\u0107 brak pliku<\/li>\n\n\n\n<li>rozr\u00f3\u017cnia\u0107 dane tekstowe i binarne<\/li>\n\n\n\n<li>logowa\u0107 b\u0142\u0119dy I\/O<\/li>\n\n\n\n<li>wykonywa\u0107 kopie zapasowe przed u\u017cyciem trybu <code>w<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Przy automatycznych importach warto najpierw pisa\u0107 do pliku tymczasowego, a dopiero potem podmienia\u0107 w\u0142a\u015bciwy plik. To chroni przed uszkodzeniem danych przy nag\u0142ym zatrzymaniu procesu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-open-tworzy-plik-automatycznie\">Czy <code>open()<\/code> tworzy plik automatycznie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, ale tylko w trybach takich jak <code>w<\/code>, <code>a<\/code> oraz <code>x<\/code>. W trybie <code>r<\/code> plik musi ju\u017c istnie\u0107.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-with-open-jest-lepsze-niz-zwykle-open\">Dlaczego <code>with open()<\/code> jest lepsze ni\u017c zwyk\u0142e <code>open()<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bo automatycznie zamyka plik. Nawet je\u015bli program przerwie dzia\u0142anie przez wyj\u0105tek, zasoby zostan\u0105 poprawnie zwolnione.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kiedy-uzywac-trybu-binarnego-b\">Kiedy u\u017cywa\u0107 trybu binarnego <code>b<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przy plikach takich jak obrazy, archiwa ZIP, PDF, pliki EXE, nagrania audio i wszystkie dane, kt\u00f3re nie s\u0105 zwyk\u0142ym tekstem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-write-dopisuje-nowa-linie-automatycznie\">Czy <code>write()<\/code> dopisuje now\u0105 lini\u0119 automatycznie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Je\u015bli potrzebny jest nowy wiersz, trzeba jawnie u\u017cy\u0107 <code>\\n<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-jednoczesnie-czytac-i-pisac-do-tego-samego-pliku\">Czy mo\u017cna jednocze\u015bnie czyta\u0107 i pisa\u0107 do tego samego pliku?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, s\u0142u\u017c\u0105 do tego tryby <code>r+<\/code>, <code>w+<\/code>, <code>a+<\/code>, ale trzeba bardzo uwa\u017ca\u0107 na pozycj\u0119 kursora i nadpisywanie danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-pojawia-sie-unicode-decode-error\">Dlaczego pojawia si\u0119 <code>UnicodeDecodeError<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej dlatego, \u017ce plik zosta\u0142 zapisany w innym kodowaniu ni\u017c to u\u017cyte podczas odczytu. Najbezpieczniej jawnie ustawi\u0107 <code>encoding=\"utf-8\"<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poprawna praca z plikami nie jest dodatkiem do programowania, tylko jego fundamentem. Wi\u0119kszo\u015b\u0107 realnych system\u00f3w dzia\u0142a w\u0142a\u015bnie na danych zapisanych poza pami\u0119ci\u0105 programu. Jedna \u017ale ustawiona flaga trybu otwarcia potrafi skasowa\u0107 miesi\u0105ce pracy, dlatego operacje wej\u015bcia i wyj\u015bcia trzeba traktowa\u0107 ostro\u017cnie, nie jako prost\u0105 formalno\u015b\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Praca z plikami jest jednym z podstawowych element\u00f3w programowania, niezale\u017cnie od j\u0119zyka. Dane rzadko istniej\u0105 wy\u0142\u0105cznie w pami\u0119ci operacyjnej \u2014 trzeba je zapisa\u0107 do raportu, odczyta\u0107 konfiguracj\u0119, przetworzy\u0107 logi albo pobra\u0107 dane wej\u015bciowe z pliku CSV, JSON czy zwyk\u0142ego tekstu. W praktyce b\u0142\u0119dy przy operacjach plikowych kosztuj\u0105 najwi\u0119cej czasu, bo cz\u0119sto prowadz\u0105 do utraty danych albo trudnych do wykrycia problem\u00f3w z kodowaniem znak\u00f3w. Podstaw\u0105 tego mechanizmu jest funkcja Open. Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu w praktyce pracy z danymi tekstowymi i binarnymi Funkcja open() w Pythonie s\u0142u\u017cy do nawi\u0105zania po\u0142\u0105czenia programu z plikiem znajduj\u0105cym si\u0119 na dysku. Sam plik fizycznie istnieje w systemie operacyjnym, natomiast program otrzymuje tzw. obiekt pliku, czyli uchwyt pozwalaj\u0105cy wykonywa\u0107 operacje wej\u015bcia i wyj\u015bcia. To rozr\u00f3\u017cnienie jest wa\u017cne. Program nie \u201epracuje na nazwie pliku\u201d, tylko na obiekcie zwr\u00f3conym przez funkcj\u0119. Nazwa jest tylko adresem, a obiekt jest narz\u0119dziem operacyjnym. Przyk\u0142adowo: System operacyjny pilnuje tak\u017ce blokad, uprawnie\u0144 i aktualnej pozycji kursora w pliku. Je\u017celi program otwiera plik, ale go nie zamyka, mo\u017ce doj\u015b\u0107 do: Dlatego poprawne zarz\u0105dzanie plikiem jest wa\u017cniejsze ni\u017c sama sk\u0142adnia. Co dok\u0142adnie zwraca funkcja open Zwracany obiekt posiada metody takie jak: To w\u0142a\u015bnie te metody wykonuj\u0105 w\u0142a\u015bciw\u0105 prac\u0119. Przyk\u0142ady podstawowego otwierania pliku J\u0119zyk Przyk\u0142ad Python plik = open(&#8222;dane.txt&#8221;, &#8222;r&#8221;, encoding=&#8221;utf-8&#8243;) C FILE *plik = fopen(&#8222;dane.txt&#8221;, &#8222;r&#8221;); C++ ifstream plik(&#8222;dane.txt&#8221;); PHP $plik = fopen(&#8222;dane.txt&#8221;, &#8222;r&#8221;); W Pythonie parametr encoding ma du\u017ce znaczenie. Bez niego system mo\u017ce u\u017cy\u0107 domy\u015blnego kodowania, kt\u00f3re r\u00f3\u017cni si\u0119 mi\u0119dzy Windows, Linux i macOS. To cz\u0119sta przyczyna b\u0142\u0119d\u00f3w z polskimi znakami. Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu oraz znaczenie tryb\u00f3w pracy i kodowania znak\u00f3w Drugi argument funkcji okre\u015bla tryb pracy. To on decyduje, czy plik b\u0119dzie tylko czytany, nadpisywany czy rozszerzany o nowe dane. Niepoprawny tryb to jedna z najcz\u0119stszych przyczyn przypadkowego usuni\u0119cia zawarto\u015bci pliku. Najwa\u017cniejsze tryby pracy Tryb Znaczenie Zachowanie r odczyt plik musi istnie\u0107 w zapis tworzy nowy lub kasuje stary a dopisywanie dopisuje na ko\u0144cu x utworzenie nowego b\u0142\u0105d je\u015bli plik istnieje rb odczyt binarny np. obraz, PDF wb zapis binarny nadpisuje plik binarny r+ odczyt i zapis plik musi istnie\u0107 a+ odczyt i dopisywanie kursor na ko\u0144cu Tryb w jest szczeg\u00f3lnie niebezpieczny. Je\u017celi plik istnieje, jego zawarto\u015b\u0107 zostaje wyczyszczona natychmiast po otwarciu \u2014 nawet je\u015bli program p\u00f3\u017aniej zako\u0144czy si\u0119 b\u0142\u0119dem. Odczyt tekstu J\u0119zyk Przyk\u0142ad Python with open(&#8222;raport.txt&#8221;, &#8222;r&#8221;, encoding=&#8221;utf-8&#8243;) as plik:\\n tresc = plik.read() C char tekst[100];\\nFILE *plik = fopen(&#8222;raport.txt&#8221;, &#8222;r&#8221;);\\nfgets(tekst, 100, plik); C++ string linia;\\nifstream plik(&#8222;raport.txt&#8221;);\\ngetline(plik, linia); Instrukcja with w Pythonie jest najlepsz\u0105 praktyk\u0105. Po zako\u0144czeniu bloku plik zamyka si\u0119 automatycznie, nawet je\u015bli wyst\u0105pi wyj\u0105tek. Zapis tekstu J\u0119zyk Przyk\u0142ad Python with open(&#8222;wynik.txt&#8221;, &#8222;w&#8221;, encoding=&#8221;utf-8&#8243;) as plik:\\n plik.write(&#8222;Ala ma kota&#8221;) C FILE *plik = fopen(&#8222;wynik.txt&#8221;, &#8222;w&#8221;);\\nfprintf(plik, &#8222;Ala ma kota&#8221;); PHP $plik = fopen(&#8222;wynik.txt&#8221;, &#8222;w&#8221;);\\nfwrite($plik, &#8222;Ala ma kota&#8221;); Kodowanie znak\u00f3w i realny problem z polskimi literami Je\u017celi plik zapisano w UTF-8, a program odczytuje go jako ANSI lub Latin-2, pojawi\u0105 si\u0119 b\u0142dy typu: W \u015brodowiskach produkcyjnych taki b\u0142\u0105d potrafi zepsu\u0107 import faktur, raport\u00f3w lub danych klient\u00f3w. Dlatego warto jawnie ustawia\u0107: Parametr Zalecenie encoding utf-8 newline kontrolowany zapis ko\u0144ca linii errors np. ignore lub replace tylko \u015bwiadomie Operacje na pozycji kursora i r\u00f3\u017cnica mi\u0119dzy odczytem sekwencyjnym a losowym Po otwarciu pliku system ustawia wska\u017anik pozycji, czyli miejsce, z kt\u00f3rego nast\u0105pi kolejny odczyt lub zapis. To dzia\u0142a podobnie jak zak\u0142adka w ksi\u0105\u017cce \u2014 program pami\u0119ta, gdzie aktualnie si\u0119 znajduje. Najwa\u017cniejsze metody Metoda Dzia\u0142anie tell() zwraca aktualn\u0105 pozycj\u0119 seek() przeskakuje do wskazanego miejsca read(n) czyta okre\u015blon\u0105 liczb\u0119 znak\u00f3w lub bajt\u00f3w Przyk\u0142ad Kod Python with open(&#8222;dane.txt&#8221;, &#8222;r&#8221;, encoding=&#8221;utf-8&#8243;) as plik:\\n print(plik.tell())\\n fragment = plik.read(5)\\n print(plik.tell())\\n plik.seek(0) Po read(5) wska\u017anik przesuwa si\u0119 dalej. Przy du\u017cych plikach log\u00f3w takie sterowanie jest konieczne, bo nie zawsze op\u0142aca si\u0119 \u0142adowa\u0107 ca\u0142y plik do pami\u0119ci. Dla pliku 5 GB u\u017cycie read() bez ogranicze\u0144 mo\u017ce zako\u0144czy\u0107 proces przez brak pami\u0119ci RAM. Odczyt liniowy lub blokowy jest wtedy jedynym rozs\u0105dnym rozwi\u0105zaniem. Open \u2013 otwiera plik i zwraca obiekt pliku do odczytu lub zapisu a najcz\u0119stsze b\u0142\u0119dy prowadz\u0105ce do utraty danych Najwi\u0119cej problem\u00f3w nie wynika z samej funkcji, tylko z nieuwa\u017cnego u\u017cycia. B\u0142\u0105d pierwszy: u\u017cycie trybu w zamiast a To klasyczny przypadek. Administrator dopisuje logi, ale przez pomy\u0142k\u0119 u\u017cywa w. Program uruchamia si\u0119 raz i ca\u0142y wcze\u015bniejszy plik znika. B\u0142\u0105d drugi: brak zamkni\u0119cia pliku Przyk\u0142ad z\u0142ej praktyki: Kod Python plik = open(&#8222;log.txt&#8221;, &#8222;w&#8221;)\\nplik.write(&#8222;test&#8221;) Brakuje close() albo with. Przy kr\u00f3tkim skrypcie mo\u017ce \u201edzia\u0142a\u0107\u201d, ale w systemie produkcyjnym to proszenie si\u0119 o problemy. Poprawnie: Kod Python with open(&#8222;log.txt&#8221;, &#8222;w&#8221;, encoding=&#8221;utf-8&#8243;) as plik:\\n plik.write(&#8222;test&#8221;) B\u0142\u0105d trzeci: za\u0142o\u017cenie, \u017ce plik zawsze istnieje Programy powinny zak\u0142ada\u0107 awari\u0119, nie idealne warunki. Mo\u017ce wyst\u0105pi\u0107: Dlatego potrzebna jest obs\u0142uga wyj\u0105tk\u00f3w. Kod Python try:\\n with open(&#8222;dane.txt&#8221;, &#8222;r&#8221;, encoding=&#8221;utf-8&#8243;) as plik:\\n print(plik.read())\\nexcept FileNotFoundError:\\n print(&#8222;Plik nie istnieje&#8221;) B\u0142\u0105d czwarty: praca na \u015bcie\u017ckach wzgl\u0119dnych bez kontroli katalogu roboczego dane.txt mo\u017ce oznacza\u0107 r\u00f3\u017cne miejsca w zale\u017cno\u015bci od tego, sk\u0105d uruchomiono program. Bezpieczniej u\u017cywa\u0107 pe\u0142nych \u015bcie\u017cek albo modu\u0142u pathlib. Wzory i zale\u017cno\u015bci u\u017cywane przy analizie operacji wej\u015bcia i wyj\u015bcia Operacje plikowe analizuje si\u0119 r\u00f3wnie\u017c pod k\u0105tem kosztu czasowego. Przybli\u017cony czas odczytu zale\u017cy od rozmiaru danych i przepustowo\u015bci no\u015bnika. Wz\u00f3r Znaczenie t = \\frac{d}{v} czas odczytu = dane \/ pr\u0119dko\u015b\u0107 no\u015bnika RAM &gt; rozmiar\\ pliku pe\u0142ny odczyt do pami\u0119ci ma sens tylko przy odpowiedniej pami\u0119ci O(n) odczyt sekwencyjny ca\u0142ego pliku O(1) lub O(log n) dost\u0119p indeksowany zale\u017cnie od struktury danych Dla SSD o realnym odczycie 500 MB\/s plik 2 GB b\u0119dzie \u0142adowany oko\u0142o 4 sekundy, bez uwzgl\u0119dnienia op\u00f3\u017anie\u0144 systemowych i obci\u0105\u017cenia procesora. Uwagi praktyczne z codziennej pracy Je\u017celi kod pracuje na raportach finansowych, backupach albo plikach klient\u00f3w, nie warto ufa\u0107 domy\u015blnym ustawieniom. Dobrze jest: Przy automatycznych importach warto najpierw pisa\u0107 do pliku tymczasowego, a dopiero potem podmienia\u0107 w\u0142a\u015bciwy plik. To chroni przed uszkodzeniem danych przy nag\u0142ym zatrzymaniu procesu. FAQ Czy open() tworzy plik automatycznie? Tak, ale tylko w trybach takich jak w, a oraz x. W trybie r plik musi ju\u017c istnie\u0107. Dlaczego with open() jest lepsze ni\u017c zwyk\u0142e open()? Bo automatycznie zamyka plik. Nawet je\u015bli program przerwie dzia\u0142anie przez wyj\u0105tek, zasoby zostan\u0105 poprawnie zwolnione. Kiedy u\u017cywa\u0107 trybu binarnego b? Przy plikach takich jak obrazy, archiwa ZIP, PDF, pliki EXE, nagrania audio i wszystkie dane, kt\u00f3re nie s\u0105 zwyk\u0142ym tekstem. Czy write() dopisuje now\u0105 lini\u0119 automatycznie? Nie. Je\u015bli potrzebny jest nowy wiersz, trzeba jawnie u\u017cy\u0107 \\n. Czy mo\u017cna jednocze\u015bnie czyta\u0107 i pisa\u0107 do tego samego pliku? Tak, s\u0142u\u017c\u0105 do tego tryby r+, w+, a+, ale trzeba bardzo uwa\u017ca\u0107 na pozycj\u0119 kursora i nadpisywanie danych. Dlaczego pojawia si\u0119 UnicodeDecodeError? Najcz\u0119\u015bciej dlatego, \u017ce plik zosta\u0142 zapisany w innym kodowaniu ni\u017c to u\u017cyte podczas odczytu. Najbezpieczniej jawnie ustawi\u0107 encoding=&#8221;utf-8&#8243;. Poprawna praca z plikami nie jest dodatkiem do programowania, tylko jego fundamentem. Wi\u0119kszo\u015b\u0107 realnych system\u00f3w dzia\u0142a w\u0142a\u015bnie na danych zapisanych poza pami\u0119ci\u0105 programu. Jedna \u017ale ustawiona flaga trybu otwarcia potrafi skasowa\u0107 miesi\u0105ce pracy, dlatego operacje wej\u015bcia i wyj\u015bcia trzeba traktowa\u0107 ostro\u017cnie, nie jako prost\u0105 formalno\u015b\u0107. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1514,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1513","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1513"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1513\/revisions"}],"predecessor-version":[{"id":1515,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1513\/revisions\/1515"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1514"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}