• Nie Znaleziono Wyników

W my_letter.txt rozszerzeniem jest.txt, co oznacza tekst, więc ten plik prawdopodobnie zawiera w sobie tekst.

N/A
N/A
Protected

Academic year: 2022

Share "W my_letter.txt rozszerzeniem jest.txt, co oznacza tekst, więc ten plik prawdopodobnie zawiera w sobie tekst."

Copied!
20
0
0

Pełen tekst

(1)

Wejście i wyjście pliku

Czy zastanawiałeś się kiedyś, jak Twoja ulubiona gra komputerowa zapamiętuje najlepsze wyniki, nawet po wyłączeniu komputera? Jak Twoja przeglądarka zapamiętuje twoje ulubione strony internetowe? W tym rozdziale dowiesz się, jak to zrobić. Kilka razy rozmawialiśmy o tym, jak programy mają trzy główne aspekty: wprowadzanie, przetwarzanie i wyjście. Do tej pory dane wejściowe pochodziły głównie bezpośrednio od użytkownika, z klawiatury i myszy. Wyjście zostało wysłane bezpośrednio na ekran (lub głośniki, w przypadku dźwięku). Ale czasami musisz użyć danych wejściowych pochodzących z innych źródeł. Dość często programy muszą wykorzystywać dane wejściowe, które są gdzieś przechowywane, a nie wprowadzane podczas działania programu. Niektóre programy muszą pobierać dane z pliku na dysku twardym komputera. Na przykład, jeśli grasz w Wisielca, twój program będzie potrzebował listy słów aby wybrać tajne słowo. Ta lista słów musiałaby być gdzieś przechowywana, prawdopodobnie w pliku „listy słów”, który towarzyszy programowi.

Program musiałby otworzyć ten plik, przeczytać listę słów i wybrać słowo do użycia. To samo dotyczy wyjścia. Czasami wyjście programu musi być przechowywane. Wszystkie zmienne używane przez program są tymczasowe - są tracone, gdy program się kończy. Jeśli chcesz zapisać niektóre informacje do późniejszego wykorzystania, musisz je przechowywać w bardziej trwałym miejscu, jak na dysku twardym. Na przykład, jeśli chcesz zachować listę najlepszych wyników dla gry, musisz zapisać je w pliku, aby przy następnym uruchomieniu program mógł odczytać plik i wyświetlić wyniki. W tej części zobaczysz, jak otwierać pliki i jak je czytać i zapisywać (uzyskiwać z nich informacje i przechowywać w nich informacje).

Co to jest plik?

Zanim zaczniemy mówić o otwieraniu, czytaniu i zapisywaniu plików, powinniśmy porozmawiać o tym, czym jest plik. Powiedzieliśmy, że komputery przechowują informacje w formacie binarnym, który używa tylko 1-nek i 0-er. Każda 1 lub 0 jest nazywane bitem, a grupa ośmiu bitów jest nazywana bajtem. Plik jest zbiorem bajtów, który ma nazwę i jest przechowywany na dysku twardym, dysku CD, dysku DVD, dysku flash lub innym rodzaju pamięci. Pliki mogą przechowywać wiele różnych rodzajów informacji. Plik może zawierać tekst, obrazy, muzykę, programy komputerowe, listę numerów telefonów i tak dalej. Wszystko, co jest przechowywane na dysku twardym komputera, jest przechowywane jako pliki. Programy składają się z jednego lub więcej plików. System operacyjny komputera (na przykład Windows lub Mac OS X lub Linux) ma wiele, wiele plików, które musi uruchomić. Pliki mają następujące właściwości:

■ Nazwa

■ Typ, który wskazuje, jakie dane znajdują się w pliku (obraz, muzyka, tekst)

■ Lokalizacja (gdzie plik jest przechowywany)

■ Rozmiar (ile bajtów jest w pliku) Nazwy plików

W większości systemów operacyjnych (w tym Windows) część nazwy pliku jest używana do określenia typu danych znajdujących się w pliku. Nazwy plików zwykle mają co najmniej jedną „kropkę” (symbol okresu) w nazwie. Część po kropce informuje, jakiego rodzaju jest to plik. Ta część nazywa się rozszerzeniem. Oto kilka przykładów:

■ W my_letter.txt rozszerzeniem jest .txt, co oznacza „tekst”, więc ten plik prawdopodobnie zawiera w sobie tekst.

(2)

■ W my_song.mp3 rozszerzeniem jest .mp3, który jest rodzajem pliku dźwiękowego.

■ W pliku my_program.exe rozszerzeniem jest .exe, co oznacza „plik wykonywalny”. Jak już wspomniałem w rozdziale 1, „wykonywanie” to kolejne słowo do uruchomienia programu. Tak więc pliki .exe są zwykle programami, które można uruchomić.

■ W my_cool_game.py rozszerzenie to .py, co zwykle oznacza program w Pythonie.

W systemie Mac OS X pliki programów (pliki zawierające program, który można uruchomić) mają rozszerzenie .app, które oznacza „aplikacja”, co jest kolejnym słowem „program”.

Ważną rzeczą, którą należy wiedzieć, jest to, że można nazwać plik dowolną rzeczą i użyć dowolnego rozszerzenia. Możesz utworzyć plik tekstowy (na przykład w Notatniku) i nazwać go my_notes.mp3. To nie czyni z niego pliku dźwiękowego. Nadal ma w nim tylko tekst, więc jest to naprawdę plik tekstowy.

Dałeś to rozszerzenie pliku, które sprawia, że wygląda jak plik dźwiękowy, co prawdopodobnie wprowadzi w błąd ludzi i komputery. Przy nadawaniu nazwy plikowi bardzo dobrze jest użyć rozszerzenia pliku, które odpowiada rodzajowi pliku.

Lokalizacje plików

Do tej pory pracowaliśmy z plikami przechowywanymi w tej samej lokalizacji, co sam program. Nie martwiliśmy się o to, jak znaleźć plik, ponieważ znajduje się w tym samym miejscu, co program. To tak, jakbyś był w swoim pokoju, nie musisz się martwić, jak znaleźć swoją szafę - jest tam. Ale jeśli jesteś w innym pokoju, w innym domu lub w innym mieście, znalezienie szafy jest bardziej skomplikowane!

Każdy plik musi być gdzieś przechowywany, więc oprócz nazwy każdy plik ma lokalizację. Dyski twarde i inne nośniki pamięci są zorganizowane w foldery lub katalogi. Foldery i katalogi to dwie nazwy tego samego. Są sposobem grupowania plików razem. Sposób, w jaki foldery lub katalogi są uporządkowane i połączone, nazywany jest strukturą folderów lub strukturą katalogów. W systemie Windows każdy nośnik pamięci ma literę, np. C na dysku twardym, a może E na dysk flash. W systemie Mac OS X i Linux każdy nośnik pamięci ma nazwę (na przykład hda lub FLASH DRIVE). Każdą jednostkę pamięci można podzielić na wiele folderów, takich jak Muzyka, Obrazy i Programy. Foldery mogą również zawierać inne foldery, a te foldery mogą zawierać inne foldery i tak dalej.

Pierwszy poziom to Muzyka. Kolejny poziom ma Nową Muzykę i Starą Muzykę, a następny poziom to Kind of old music i Really old music.

Foldery w innych folderach są nazywane podfolderami. Jeśli używamy terminu katalogi, nazwałbyś je podkatalogami

Gdy próbujesz znaleźć plik lub folder w Eksploratorze Windows (lub innej przeglądarce plików), foldery są jak gałęzie drzewa. Korzeń to sam napęd, jak C: lub E :. Każdy główny folder jest jak główny

(3)

gałąź drzewa. Foldery w każdym głównym folderze są jak mniejsze gałęzie i tak dalej. Ale kiedy trzeba uzyskać dostęp do plików z poziomu programu, pomysł drzewa nie działa. Twój program nie może kliknąć folderów i przeglądać drzewa, aby znaleźć pojedyncze pliki. Potrzebuje bardziej bezpośredniego sposobu znalezienia pliku. Na szczęście istnieje inny sposób przedstawienia struktury drzewa. Jeśli spojrzysz na pasek adresu Eksploratora Windows po kliknięciu różnych folderów i podfolderów, zobaczysz coś, co wygląda tak:

E:\Muzyka\ Stara muzyka Naprawdę stara muzyka\my_song.mp3

To się nazywa ścieżka. Ścieżka jest opisem, gdzie plik znajduje się w strukturze folderów. Ta konkretna ścieżka brzmi następująco:

1 Zacznij od napędu E :.

2 Przejdź do folderu o nazwie Muzyka.

3 W folderze Muzyka przejdź do podfolderu o nazwie Stara muzyka.

4 W podfolderze Stara Muzyka przejdź do podfolderu o nazwie Naprawdę stara muzyka.

5 W podfolderze Naprawdę stara muzyka znajduje się plik o nazwie my_song.mp3.

Możesz dostać się do dowolnego pliku na komputerze, używając ścieżki takiej jak ta. W ten sposób programy znajdują i otwierają pliki. Oto przykład:

image_file = "c: / program files / HelloWorld / examples / beachball.png"

Zawsze możesz dostać się do pliku używając jego pełnej ścieżki. Jest to nazwa, w tym wszystkie nazwy folderów bezpośrednio po drzewie do katalogu głównego (dysk, np. C :). Nazwa w tym przykładzie jest pełną ścieżką dostępu.

Slash lub backslash?

Ważne jest, aby ukośniki (\ i /) poszły we właściwy sposób. Windows zaakceptuje ukośnik (/) lub odwrotny ukośnik ( \ ) w nazwach ścieżek, ale jeśli użyjesz czegoś takiego jak c:\program.txt w programie Python, część \t spowoduje problem. Pamiętasz, że w części 21 rozmawialiśmy o znakach specjalnych do formatowania wydruku, np. \t dla tabulacji. Dlatego należy unikać znaków w ścieżkach plików. Python (i Windows) będą traktować jako znak tabulacji zamiast części nazwy pliku zgodnie z przeznaczeniem. Użyj / zamiast. Inną opcją jest użycie podwójnych ukośników odwrotnych, takich jak ten

image_file "c:\\program files\HelloWorld\images\beachball.png"

Pamiętaj, że jeśli chcesz wydrukować znak, musisz umieścić inny przed nim. Działa w ten sam sposób w nazwach plików. Ale zalecam używanie / zamiast.

Czasami nie potrzebujesz całej ścieżki do pliku. Następna sekcja mówi o znalezieniu pliku, jeśli jesteś już w drodze.

Znajdujesz gdzie jesteś

Większość systemów operacyjnych (w tym Windows) ma pomysł na katalog roboczy, czasami nazywany bieżącym katalogiem roboczym lub w skrócie cwd. Jest to katalog w drzewie folderów, w którym aktualnie pracujesz. Wyobraź sobie, że zacząłeś w katalogu głównym (C :), i przeniosłeś się w dół do gałęzi Program Files do gałęzi Hello World. Twoja bieżąca lokalizacja lub bieżący katalog to C: / Program Files / Hello World.

(4)

Teraz, aby dostać się do pliku o nazwie beachball.png, musisz przejść do gałęzi Przykłady. Tak więc twoją ścieżką do uzyskania byłoby Przykłady / beachball.png. Ponieważ byłeś już na dobrej drodze, potrzebowałeś tylko reszty ścieżki, aby dostać się tam, gdzie chciałeś.

Pamiętasz, z części 19 dotyczącej dźwięku, otworzyliśmy nasze pliki dźwiękowe jako splat.wav i tak dalej? Nie użyliśmy ścieżki. To dlatego, że kazałem ci skopiować pliki dźwiękowe do tego samego folderu, w którym zapisałeś program.

Zauważ, że mam pliki Pythona (z rozszerzeniem .py) w tym samym folderze co pliki dźwiękowe (z rozszerzeniem .wav). Gdy uruchomiony jest program w Pythonie, jego katalog roboczy znajduje się w dowolnym folderze, w którym przechowywany jest plik .py. Jeśli zapisałeś swój program w e:/

programs i uruchomił program, program ten zaczynałby się od e: /programs jako katalog roboczy. Jeśli masz plik dźwiękowy przechowywany w tym samym folderze, Twój program potrzebuje tylko nazwy pliku, aby użyć tego pliku. Nie potrzeba ścieżki, aby się tam dostać, ponieważ już tam jest. Więc możesz to zrobić:

my_sound = pygame.mixer.Sound ("splat.wav")

Zwróć uwagę, że nie musisz używać pełnej ścieżki do pliku dźwiękowego (który byłby e:

/programs/splat.wav). Wystarczy użyć nazwy pliku bez ścieżki, ponieważ plik znajduje się w tym samym folderze, co program, który go używa.

Dość o ścieżkach!

To wszystko, co powiem o ścieżkach i lokalizacjach plików. Cały temat folderów i katalogów, ścieżek, katalogów roboczych i tak dalej jest taki, który niektórzy ludzie mylą, a pełne wyjaśnienie tego zajęłoby wiele stron. Ale ta książka dotyczy programowania, a nie o systemach operacyjnych, lokalizacjach plików lub ścieżkach, więc jeśli masz z tym problemy, możesz poprosić o pomoc rodzica, nauczyciela lub kogoś innego, kto wie o komputerach. Wszystkie inne przykłady w tej książce, które używają plików, mają je w tym samym miejscu co program, więc nie musisz się martwić o ścieżkę ani o używanie pełnych ścieżek.

Otwieranie pliku

Zanim otworzysz plik, musisz wiedzieć, co zrobisz z plikiem:

■ Jeśli będziesz używać pliku jako danych wejściowych (patrząc na to, co znajduje się w pliku, nie zmieniając go), otworzysz plik do czytania.

■ Jeśli utworzysz nowy plik lub zastąpisz istniejący plik czymś zupełnie nowym, otworzysz plik do zapisu.

■ Jeśli będziesz dodawać do istniejącego pliku, otworzysz plik do dołączenia. (Pamiętasz z części 12, że dołączenie oznacza dodanie do czegoś.)

Kiedy otwierasz plik, tworzysz obiekt pliku w Pythonie. (Zobacz, powiedziałem ci, że wiele rzeczy w Pythonie to obiekty.) Obiekt pliku tworzysz za pomocą funkcji open() z nazwą pliku, taką jak ta:

my_file = open ('moja_nazwa_pliku.txt', 'r')

Nazwa pliku jest łańcuchem, więc potrzebuje cytatów wokół niego. Część „r” oznacza, że otwierasz plik do czytania. Dowiesz się więcej na ten temat w następnej sekcji. Ważne jest, aby zrozumieć różnicę między obiektem pliku a nazwą pliku. Obiekt pliku jest tym, którego użyjesz w programie, aby uzyskać dostęp do pliku. Nazwa pliku jest tym, co system Windows (lub Linux lub Mac OS X) wywołuje plik na

(5)

dysku. Robisz to samo z ludźmi. Masz różne nazwy, których używasz w różnych miejscach. Jeśli imię twojego nauczyciela to Fredek Wesoły, prawdopodobnie nazywasz go panem Wesołym. Jego przyjaciele prawdopodobnie nazywają go Fred, a jego nazwa użytkownika komputera może być fwesoly. W przypadku plików istnieje nazwa używana przez system operacyjny do przechowywania pliku na dysku (nazwa pliku), a także nazwa używana przez program podczas pracy z plikiem (obiekt pliku). Dwie nazwy - nazwa obiektu i nazwa pliku - nie muszą być takie same. Możesz zadzwonić do obiektu, jak chcesz. Na przykład, jeśli mamy plik tekstowy z kilkoma notatkami o nazwie notes.txt, możemy to zrobić:

notes = open ('notes.txt', 'r')

↑ ↑

Obiekt pliku Nazwa pliku Albo możemy to zrobić:

some_crazy_stuff = open("notes.txt", 'r')

↑ ↑ Obiekt pliku Nazwa pliku

Po otwarciu pliku i utworzeniu obiektu pliku nazwa pliku nie jest już potrzebna. Robisz wszystko w programie, używając obiektu pliku.

Czytanie pliku

Jak wspomniałem w ostatniej sekcji, otwierasz plik i tworzysz obiekt pliku za pomocą funkcji open().

Jest to jedna z wbudowanych funkcji Pythona. Aby otworzyć plik do odczytu, należy użyć „r” jako drugiego argumentu, takiego jak ten:

my_file = open ('notes.txt', 'r')

Jeśli spróbujesz otworzyć plik do czytania, który nie istnieje, pojawi się błąd. (Przecież nie możesz przeczytać czegoś, czego tam nie ma, prawda?) Python ma kilka wbudowanych funkcji do pobierania informacji z pliku do twojego programu po otwarciu pliku. Aby odczytać wiersze tekstu z pliku, możesz użyć metody readlines (), takiej jak ta:

lines = mój_plik.readlines ()

Spowoduje to odczytanie całego pliku i utworzenie listy z jednym wierszem tekstu w każdym elemencie listy. Powiedzmy, że plik notes.txt zawierał krótką listę rzeczy, które musimy zrobić dzisiaj:

Myć samochód Pościelić łóżko Odebrać zasiłek

Moglibyśmy użyć programu takiego jak Notatnik do utworzenia tego pliku. W rzeczywistości, dlaczego nie tworzysz takiego pliku za pomocą Notatnika (lub ulubionego edytora tekstu) w tej chwili? Wywołaj go notes.txt i zapisz w tym samym miejscu, w którym zapisujesz programy w Pythonie. Następnie zamknij Notatnik. Jeśli otworzymy ten plik za pomocą krótkiego programu Python i przeczytamy go, kod może wyglądać tak:

(6)

Listing 22.1 Otwieranie i czytanie z pliku my_file = open('notes.txt', 'r')

lines = my_file.readlines() print lines

Wynik byłby taki (w zależności od tego, co umieściłeś w pliku):

>>>======================= RESTART =========================

>>>

['Umyć samochód', 'Pościelić łóżko', 'Odbierz zasiłek']

Linie tekstu zostały odczytane z pliku i zostały umieszczone na liście, którą nazwaliśmy liniami. Każdy element na liście jest łańcuchem zawierającym jedną linię z pliku. Zauważ część n na końcu pierwszych dwóch wierszy. Są to znaki nowej linii, które oddzielają linie w pliku. Właśnie wtedy nacisnęliśmy Enter podczas tworzenia pliku. Jeśli naciśniesz Enter po wpisaniu ostatniej linii, pojawi się trzecia n po trzeciej pozycji. Jest jeszcze jedna rzecz, którą musimy dodać do programu w liście 22.1. Kiedy skończymy z plikiem, powinniśmy go zamknąć:

my_file.close()

Jeśli inny program musi użyć pliku, a nasz program go nie zamknął, inny program może nie mieć dostępu do pliku. Zasadniczo dobrym pomysłem jest zamykanie plików po zakończeniu ich używania.

Gdy plik znajdzie się w twoim programie jako lista ciągów, możesz zrobić, co zechcesz. Ta lista jest jak każda inna lista Pythonaa, dzięki czemu możesz przechodzić przez nią, sortować, dodawać elementy, usuwać elementy i tak dalej. Ciągi są jak inne ciągi, więc możesz je wydrukować, przekonwertować na int lub float (jeśli zawierają liczby), użyć ich jako etykiet w GUI lub zrobić coś innego, co zrobiłbyś za pomocą łańcucha. Czytanie jednej linii na raz metodą readlines() odczytuje wszystkie wiersze pliku, aż do końca pliku. Jeśli chcesz czytać tylko jedną linię na raz, możesz użyć metody readline(), tak jak poniżej: To spowoduje przeczytanie pierwszej linii pliku. Jeśli ponownie użyjesz readline() w tym samym programie, Python pamięta, gdzie był. Więc za drugim razem użyjesz drugiej linii pliku.

Następna lista pokazuje przykład tego.

Listing 22.2 Używanie readline () więcej niż raz my_file = open('notes.txt', 'r')

first_line = my_file.readline() second_line = my_file.readline() print "first line = ", first_line print "second line = ", second_line my_file.close()

The output of that program would look like this:

>>>================== RESTART ====================

>>>

(7)

first line = Myć samochód second line = Pościelić łóżko

Metoda readline() odczytuje tylko jedną linię na raz, więc nie umieszcza wyników na liście. Za każdym razem, gdy używasz readline(), otrzymujesz pojedynczy ciąg.

Wracając do początku

Jeśli używałeś readline () kilka razy i chcesz zacząć od początku pliku, możesz użyć metody seek (), takiej jak ta:

first_line = my_file.readline() second_line = my_file.readline() my_file.seek(0)

first_line_again = my_file.readline()

Metoda seek() sprawia, że Python przechodzi do dowolnego miejsca w pliku, który powiesz. Liczba w nawiasach to liczba bajtów od początku pliku. Więc ustawienie na 0 powoduje powrót do początku pliku.

Pliki tekstowe i pliki binarne

Wszystkie przykłady otwierania plików i czytania wierszy tekstu zakładają jedno: plik ma w sobie tekst!

Pamiętaj, że tekst jest tylko jednym z rzeczy, które możesz przechowywać w pliku. Programiści gromadzą wszystkie inne rodzaje plików i nazywają je plikami binarnymi.

Istnieją dwa główne typy plików, które można otworzyć:

■ Pliki tekstowe - zawierają w sobie tekst, litery, cyfry, znaki interpunkcyjne i niektóre znaki specjalne, takie jak znaki nowej linii.

■ Pliki binarne - nie zawierają w nich tekstu. Mogą mieć muzykę, obrazy lub jakieś dane, ale ponieważ nie mają tekstu, nie mają też linii, ponieważ nie ma znaków nowej linii.

Oznacza to, że nie możesz użyć readline() lub readlines() w pliku binarnym. Jeśli na przykład spróbujesz odczytać „linię” z pliku .wav, nie wiesz, co otrzymasz. Najprawdopodobniej dostaniesz całą masę dziwactwa, które wygląda tak:

(8)

Na początku pliku .wav to jest coś, co wygląda jak tekst, ale potem staje się szalone. Ponieważ plik .wav nie zawiera w sobie tekstu, ma dźwięk. Metody readline() i readlines() służą tylko do odczytu plików tekstowych. W większości przypadków, jeśli chcesz użyć pliku binarnego, będziesz używał czegoś takiego jak Pygame lub innego modułu do załadowania pliku, tak jak w części 19:

pygame.mixer.music.load ('bg_music.mp3')

W takim przypadku Pygame dba o otwarcie pliku i odczyt danych binarnych (w tym przykładzie jest to muzyka). Ta książka nie obejmuje sposobu przetwarzania plików binarnych. Ale po prostu wiesz, jak to wygląda możesz otworzyć plik binarny, dodając b do trybu plików, w ten sposób:

my_music_file = open ('bg_music.mp3', 'rb')

Część „rb” oznacza, że otwierasz plik do odczytu w trybie binarnym.

W ostatnich kilku sekcjach nauczyłeś się, jak uzyskać informacje z pliku do swojego programu, co nazywa się odczytaniem pliku. Następnie dowiesz się, jak przekazywać informacje ze swojego programu do pliku. Nazywa się to zapisywaniem pliku.

Zapis do pliku

Jeśli chcesz trwale zapisać niektóre informacje z programu, możesz je obejrzeć na ekranie i zapisać na kartce papieru. Ale tego rodzaju porażki cel korzystania z komputera! Lepszym pomysłem jest zapisanie informacji na dysku twardym, tak aby nawet wtedy, gdy program nie działa - w rzeczywistości, nawet gdy komputer jest wyłączony - dane są nadal dostępne i można je pobrać później. Zrobiłeś to już wiele, wiele razy. Za każdym razem, gdy zapisać raport dla szkoły, obraz, utwór lub program w Pythonie, przechowujesz go na dysku twardym.

Kiedy mieliśmy tylko papier! Nie było monitorów, drukarek ani nawet klawiatur. Kod „pisałeś”, dziurkując karty. Następnie zasiliłeś ten stos kart w wielką maszynę, która zamieniłaby dziurkowane otwory w sygnały elektryczne, które komputer mógł zrozumieć. Czasami uzyskanie odpowiedzi zajęło dni. Chłopcze, to było takie bolesne!

Jak wspomniałem wcześniej, istnieją dwa sposoby umieszczania rzeczy w pliku:

■ Pisanie - oznacza rozpoczęcie nowego pliku lub nadpisanie istniejącego.

■ Dołączanie - oznacza to dodanie do istniejącego pliku i zachowanie tego, co już istnieje.

Aby napisać lub dołączyć do pliku, musisz najpierw otworzyć plik. Używasz funkcji open (), tak jak poprzednio, z tym wyjątkiem, że drugi parametr będzie inny:

■ Do czytania używasz „r” jako trybu pliku:

(9)

my_file = open ('new_notes.txt', 'r')

■ Do pisania używasz „w” jako trybu pliku:

my_file = open ('new_notes.txt', 'w')

■ Do dołączania używasz „a” jako trybu plików:

my_file = open ('notes.txt', 'a')

Jeśli użyjesz „a” w trybie dodawania, nazwa pliku musi być taka, która już istnieje na dysku twardym, lub pojawi się błąd. Dzieje się tak dlatego, że dołączenie służy do dodawania do istniejącego pliku.

Jeśli użyjesz „w” do trybu zapisu, istnieją dwie możliwości:

■ Jeśli plik już istnieje, wszystko, co znajduje się w pliku, zostanie utracone i zastąpione tym, co tam napiszesz.

■ Jeśli plik nie istnieje, zostanie utworzony nowy plik o tej nazwie, a cokolwiek napiszesz, trafi do nowego pliku.

Spójrzmy na kilka przykładów.

Dołączanie do pliku

Najpierw weźmiemy utworzony wcześniej plik notes.txt i do niego coś dołączymy. Dodajmy kolejną linię, która mówi „Wydawaj zasiłek”. Gdybyście uważnie przyjrzeli się przykładowi readlines (), moglibyście zauważyć, że na końcu ostatniej linii nie ma n, nie ma nowej linii. Więc musimy dodać jeden, a następnie dodać nasz nowy ciąg. Aby napisać łańcuchy do pliku, używamy metody write (), takiej jak ta.

Listing 22.3 Korzystanie z trybu dołączania

todo_list = open('notes.txt', 'a') <- Otwórz plik , w trybie append todo_list.write('\nSpend allowance') <- Dodajemy nasz string na końcu todo_list.close() <- Zamykamy plik

Kiedy odczytywaliśmy pliki, powiedziałem, że powinieneś zamknąć plik, gdy skończysz. Ale jeszcze ważniejsze jest użycie close(), gdy skończysz pisać. To dlatego, że zmiany nie są zapisywane w pliku, dopóki go nie zamkniesz (). Po uruchomieniu programu w listingu 22.3 otwórz plik notes.txt za pomocą Notatnika (lub dowolnego innego edytora tekstu) i zobacz, co w nim jest. Pamiętaj, aby zamknąć Notatnik, gdy skończysz.

Zapis do pliku

Wypróbujmy teraz przykład zapisu do pliku przy użyciu trybu zapisu. Otworzymy plik, który nie znajduje się na dysku twardym. Wpisz program na tej liście i uruchom go.

Listing 22.4 Używanie trybu zapisu w nowym pliku new_file = open („my_new_notes.txt”, „w”) new_file.write („Zjedz kolację \n”)

new_file.write („Graj w piłkę nożną \n”)

(10)

new_file.write („Idź spać”) new_file.close ()

Skąd wiesz, że to zadziałało? Sprawdź w folderze, w którym zapisałeś program z listy 22.4. Powinieneś zobaczyć plik o nazwie my_new_notes.txt. Możesz otworzyć ten plik w Notatniku, aby zobaczyć, co w nim jest. Powinieneś to zobaczyć:

Zjedz kolację Graj w piłkę nożną Iść spać

W tym programie utworzyłeś plik tekstowy i zapisałeś w nim jakiś tekst. Ten tekst jest na dysku twardym i pozostanie tam na zawsze - lub przynajmniej tak długo, jak dysk twardy będzie działał - chyba że go usuniesz. Masz więc sposób na trwałe przechowywanie danych ze swoich programów. Teraz twoje programy mogą pozostawić trwały ślad na świecie (lub przynajmniej na dysku twardym).

Wszystko, co musisz zachować, gdy program się zatrzyma, a komputer zostanie wyłączony, możesz umieścić w pliku. Zobaczmy, co się stanie, jeśli użyjemy trybu zapisu na pliku, który jest już na dysku twardym. Pamiętasz nasz plik o nazwie notes.txt? Jeśli uruchomiłeś program na listingu 22.3, wygląda to tak:

Myć samochód Pościelić łóżko Odbierz zasiłek Wydać zasiłek

Otwórzmy ten plik w trybie zapisu i napiszmy go, aby zobaczyć, co się stanie. Oto kod.

Listing 22.5 Używanie trybu zapisu w istniejącym pliku the_file = open ('notes.txt', 'w')

the_file.write („Obudź się \n”) the_file.write („Oglądaj kreskówki”) the_file.close

Uruchom ten kod, a następnie otwórz plik notes.txt w Notatniku, aby zobaczyć, co zawiera. Powinieneś to zobaczyć:

Obudź się

Oglądaj kreskówki

Rzeczy, które były wcześniej w notes.txt, zniknęły. Został on zastąpiony przez nowe rzeczy z programu na listingu 22.5.

Zapis do pliku za pomocą print

(11)

W ostatniej sekcji napisaliśmy do pliku za pomocą write (). Możesz także użyć drukowania do zapisu do pliku. Nadal musisz otworzyć plik w trybie zapisu lub dodawania, ale potem możesz napisać do pliku za pomocą print, jak poniżej:

my_file = open („new_file.txt”, „w”) print >> my_file, "Cześć, sąiad!"

mój_plik.close()

Dwa symbole > (zwane czasem szewronami) mówią print , aby wysłał swoje wyjście do pliku zamiast na ekran. Nazywa się to wyjściem przekierowującym. Czasem wygodniej jest używać print niż write(), ponieważ print robi takie rzeczy, jak automatyczna konwersja liczb na łańcuchy, i tak dalej. Możesz zdecydować, czy użyć print, czy write (), aby umieścić tekst w pliku.

Zapisywanie rzeczy w plikach: pickle

W pierwszej części rozmawialiśmy o czytaniu i pisaniu do/z plików tekstowych. Pliki tekstowe to jeden ze sposobów przechowywania rzeczy na dysku twardym. Ale co, jeśli chcesz przechowywać coś w rodzaju listy lub obiektu? Czasami elementy na liście mogą być ciągami znaków, ale nie zawsze. A co z przechowywaniem rzeczy takich jak przedmioty? Możesz być w stanie przekonwertować wszystkie właściwości obiektu na łańcuchy i zapisać je w pliku tekstowym, ale wtedy będziesz musiał zrobić coś przeciwnego, aby przejść z pliku do obiektu. To może się skomplikować. Na szczęście Python ułatwia sposób przechowywania takich rzeczy, jak listy i obiekty. Jest to moduł Pythona zwany pickle. To zabawna nazwa, ale pomyśl o tym: marynowanie to sposób na zachowanie żywności, dzięki czemu możesz z niej korzystać później. W Pythonie „marynujesz” swoje dane, abyś mógł je zapisać na dysku i użyć później. Ma to sens!

Marynowanie

Powiedzmy, że mamy listę zawierającą różne rzeczy, takie jak:

my_list = ['Fred', 73, 'Cześć', 81.9876e-13]

Aby użyć pikli, najpierw musisz zaimportować moduł pikli:

import pickle

Następnie, aby coś „marynować”, na przykład listę, używasz funkcji dump(). (Łatwo to zapamiętać, jeśli myślisz o wyrzuceniu pikli do słoika). Funkcja dump () wymaga obiektu pliku i wiesz, jak zrobić jedną z nich:

pickle_file = open ('my_pickled_list.pkl', 'w')

Otwieramy go do pisania za pomocą „w”, ponieważ będziemy przechowywać coś w tym pliku. Możesz wybrać dowolne imię i rozszerzenie. Wybrałem .pkl jako rozszerzenie, skrót od „pickle”. Następnie dump() naszą listę do pliku pickle:

pickle.dump (my_list, pickle_file) Cały proces wygląda tak.

Listing 22.6 Używanie pikli do przechowywania listy do pliku import pickle

(12)

my_list = ['Fred', 73, 'Cześć', 81.9876e-13]

pickle_file = open ('my_pickled_list.pkl', 'w') pickle.dump (my_list, pickle_file)

pickle_file.close ()

Możesz użyć tej samej metody do przechowywania dowolnej struktury danych do pliku. Ale co z powrotem? To jest następne.

Unpickling

W prawdziwym życiu, kiedy coś marynujesz, pozostaje marynowane. Nie możesz go cofnąć. Ale w Pythonie, gdy „zachowujesz” niektóre dane przez wytrawianie, możesz również odwrócić proces i odzyskać dane w taki sposób, w jaki było. Funkcją „rozpakowywania” jest ładowanie (). Dajesz mu obiekt pliku dla pliku, który zawiera marynowane dane, i dajesz dane z powrotem w oryginalnej postaci. Spróbujmy. Jeśli uruchomiłeś program na liście 22.6, powinieneś mieć plik o nazwie my_pickled_list.pkl w tym samym miejscu, w którym przechowujesz swoje programy. Teraz wypróbuj program na następnej liście i sprawdź, czy otrzymasz tę samą listę.

Listing 22.7 Rozpuszczanie przy użyciu load () import pickle

pickle_file = open('my_pickled_list.pkl', 'r') recovered_list = pickle.load(pickle_file) pickle_file.close()

print recovered_list

You should get output that looks like this:

['Fred', 73, 'Hello there', 8.1987599999999997e-012]

Wygląda na to, że nieudolna praca! Odzyskaliśmy te same rzeczy, które wybraliśmy. Zapis E wygląda trochę inaczej, ale jest to ten sam numer, co najmniej do 16 miejsc po przecinku. Różnica polega na błędzie zaokrąglania, o którym mówiliśmy w części 4. W następnej sekcji wykorzystamy to, czego się dowiedzieliśmy, o wprowadzaniu i wyprowadzaniu plików, aby pomóc nam w stworzeniu nowej gry.

Znowu czas gry - Wisielec

Dlaczego mamy grę w rozdziale o plikach? Cóż, jedną z rzeczy, które sprawiają, że gra w Szubienicę jest interesująca, jest ładna, duża lista słów, z których można wybierać puzzle. Najprostszym sposobem na to jest odczytanie go z pliku. Użyjemy również PyQt do tej gry, aby pokazać, że używanie Pygame nie jest jedynym sposobem tworzenia gier graficznych. Nie będę wyjaśniać tego programu w sposób tak szczegółowy, jak niektóre inne programy. Do tej pory powinieneś być w stanie spojrzeć na kod i dowiedzieć się, jak większość z nich działa samodzielnie. Podam ci tylko kilka wskazówek, które pomogą ci w tym.

GUI Wisielca

Główny GUI dla naszego programu Wisielec wygląda następująco:

(13)

Pokazuje wszystkie części powieszonego człowieka, ale kiedy program się uruchomi, zaczniemy od ukrycia wszystkich jego części. Gdy gracz odgadnie niewłaściwą literę, ujawnimy część ludzika. Jeśli cały ludzik zostanie pociągnięty, to koniec gry! Gdy gracz odgadnie literę, program sprawdza, czy litera znajduje się w tajnym słowie. Jeśli tak, list zostaje ujawniony. Pośrodku okna gracz widzi wszystko, co do tej pory odgadł. Gracz może również spróbować odgadnąć słowo w dowolnym momencie.

Oto podsumowanie działania programu.

Na początku program wykonuje następujące czynności:

■ Ładuje listę słów z pliku

■ Usuwa znaki nowej linii z końca każdej linii

■ Sprawia, że wszystkie części ludzika są niewidoczne

■ Losowo wybiera słowo z listy słów

■ Pokazuje tę samą liczbę kresek, ile jest liter w tajnym słowie Gdy gracz kliknie Zgadnij! przycisk, program robi te rzeczy:

■ Sprawdza, czy zgadywanie jest pojedynczą literą czy słowem

■ Jeśli jest to litera:

■ Sprawdza tajne słowo, aby zobaczyć, czy zawiera literę

■ Jeśli odgadnięcie gracza jest prawidłowe, pokazuje miejsca, w których pojawia się litera, zastępując myślnik literą

■ Jeśli odgadnięcie gracza jest błędne, ujawnia część mężczyzny

■ Dodaje zgadywaną literę do ekranu Poprzednie zgadywania

■ Sprawdza, czy gracz ukończył słowo (odgadł wszystkie litery)

(14)

■ Jeśli to słowo:

■ Sprawdza, czy domysł gracza jest prawidłowy

■ Jeśli tak, wyświetla okno dialogowe z informacją o wygranej! i rozpoczyna nową grę

■ Sprawdzanie, czy gracz nie ma zakrętów - jeśli tak, wyświetla okno dialogowe z informacją „Utraciłeś”

i pokazuje, jakie było tajne słowo Pobieranie słów z listy słów

To jest część o plikach, więc spójrzmy na część programu, która pobiera listę słów. Kod wygląda tak:

f = open("words.txt", 'r') self.lines = f.readlines() for line in self.lines:

line.strip() <- Usuwa newline z każdej linii f.close()

Plik words.txt jest tylko plikiem tekstowym, więc możemy go odczytać za pomocą readlines().

Następnie, aby wybrać słowo z listy, używamy funkcji random.choice() w następujący sposób:

self.currentword = random.choice (self.lines) Ujawnienie ludzika

Istnieje kilka sposobów, dzięki którym moglibyśmy śledzić, które części człowieka są już ujawnione, a które ujawnić dalej. Postanowiliśmy użyć pętli. To wygląda tak:

def wrong(self):

self.pieces_shown += 1

for i in range(self.pieces_shown):

self.pieces[i].setHidden(False)

if self.pieces_shown == len(self.pieces):

message = " Przegrałeś. To było słowo " + self.currentword QtGui.QMessageBox.warning(self,"Hangman",message) self.new_game()

Używamy self.pieces_shown, aby śledzić, ile kawałków kata pokazujemy. Jeśli pokazane są wszystkie elementy, używamy okna dialogowego, aby powiedzieć graczowi, że przegrał.

Sprawdzanie zgadywania litery

Jedną z najtrudniejszych części tego programu jest sprawdzenie zgadywanej litery gracza, aby sprawdzić, czy pojawia się w tajnym słowie. To, co sprawia, że jest trudne, jest to, że litera może pojawić się więcej niż raz w słowie. Na przykład, jeśli tajne słowo to lever, a gracz zgaduje e, musisz ujawnić zarówno drugą, jak i czwartą literę, ponieważ obie to e. Mamy kilka funkcji, które pomagają nam to zrobić. Funkcja find_letters () wyszukuje wszystkie miejsca, w których dana litera pojawia się w

(15)

słowie, i zwraca listę tych pozycji. Na przykład, dla litery e i dźwigni słowa, powróci [1, 3], ponieważ litera e pojawia się przy indeksie 1 i indeksie 3 w ciągu. (Pamiętaj, że indeksy zaczynają się od 0.) Oto kod:

def find_letters(letter, a_string):

locations = []

start = 0

while a_string.find(letter, start, len(a_string)) != -1: <- Sprawdza, gdzie pojawia się litera location = a_string.find(letter, start, len(a_string))

locations.append(location) start = location + 1

return locations

Funkcja replace_letters() pobiera listę z find_letters() i zastępuje myślniki w tych pozycjach poprawną literą. W naszym przykładzie (litera ew „dźwigni”) zastąpiłaby --- opcją -e-e-. Pokazuje gracza, w którym na słowie pojawiają się poprawnie odgadnięte litery, a resztę pozostawia jako kreski. Oto kod:

def replace_letters(string, locations, letter):

new_string = ''

for i in range (0, len(string)):

if i in locations:

new_string = new_string + letter else:

new_string = new_string + string[i]

return new_string

Następnie, gdy gracz zgaduje literę, używamy dwóch zdefiniowanych przez nas funkcji: find_letters () i replace_letters ():

if len(guess) == 1: <-Czy zgadujemy jedną literę?

if guess in self.currentword: <- Sprawdza, czy litera jest słowem

locations = find_letters(guess, self.currentword) <- Sprawdza, gdzie pojawia się litera self.word.setText(replace_letters(str(self.word.text()),

locations,guess))

if str(self.word.text()) == self.currentword:

self.win() else:

self.wrong()

(16)

Całkowity program składa się z około 95 linii kodu oraz kilku pustych linii, aby wszystko wyglądało ładnie. Listing 22.8 pokazuje cały program, z kilkoma notatkami wyjaśniającymi różne sekcje. Kod znajduje się w folderze przykładów Wisielca na komputerze, jeśli korzystasz z instalatora, a także na stronie internetowej. Zawiera hangman.py, hangman.ui i words.txt. Pamiętaj, jak wspomnieliśmy w części 20, jeśli jesteś na Macu, musisz otworzyć hangman.ui w Qt Designer i odznaczyć właściwość nativeMenuBar dla obiektu paska menu.

Listing 22.8 Cały program hangman.py import sys

from PyQt4 import QtCore, QtGui, uic import random

form_class = uic.loadUiType("hangman.ui")[0]

def find_letters(letter, a_string):

locations = []

start = 0

while a_string.find(letter, start, len(a_string)) != -1:

location = a_string.find(letter, start, len(a_string)) locations.append(location)

start = location + 1 return locations

def replace_letters(string, locations, letter):

new_string = ''

for i in range (0, len(string)):

if i in locations:

new_string = new_string + letter else:

new_string = new_string + string[i]

return new_string def dashes(word):

letters = "abcdefghijklmnopqrstuvwxyz"

new_string = ''

for i in word:

if i in letters:

new_string += "-"

(17)

else:

new_string += i return new_string

class MyWidget(QtGui.QMainWindow, form_class):

def __init__(self, parent=None):

QtGui.QMainWindow.__init__(self, parent) self.setupUi(self)

self.btn_guess.clicked.connect(self.btn_guess_clicked) self.actionExit.triggered.connect(self.menuExit_selected) self.pieces = [self.head, self.body, self.leftarm, self.leftleg, self.rightarm, self.rightleg]

self.gallows = [self.line1, self.line2, self.line3, self.line4] <- Części szubienicy self.pieces_shown = 0

self.currentword = ""

f=open("words.txt", 'r') self.lines = f.readlines()

f.close()

self.new_game() def new_game(self):

self.guesses.setText("")

self.currentword = random.choice(self.lines) <- Losowo wybierz słowo z listy self.currentword = self.currentword.strip()

for i in self.pieces:

i.setFrameShadow(QtGui.QFrame.Plain) i.setHidden(True)

for i in self.gallows:

i.setFrameShadow(QtGui.QFrame.Plain)

self.word.setText(dashes(self.currentword)) <- Wywołuje funkcję zastępowania liter myślnikami self.pieces_shown = 0

def btn_guess_clicked(self):

guess = str(self.guessBox.text()) |

(18)

if str(self.guesses.text()) != "":

self.guesses.setText(str(self.guesses.text())+", "+guess) else:

self.guesses.setText(guess)

if len(guess) == 1:

if guess in self.currentword:

locations = find_letters(guess, self.currentword) self.word.setText(replace_letters(str(self.word.text()), locations,guess))

if str(self.word.text()) == self.currentword:

self.win() else:

self.wrong() else:

if guess == self.currentword:

self.win() else:

self.wrong()

self.guessBox.setText(**) def win(self):

QtGui.QMessageBox.information(self,"Hangman","You win!") self.new_game()

def wrong(self):

self.pieces_shown += 1

for i in range(self.pieces_shown):

self.pieces[i].setHidden(False)

if self.pieces_shown == len(self.pieces):

message = "You lose. The word was " + self.currentword QtGui.QMessageBox.warning(self,"Hangman", message) self.new_game()

def menuExit_selected(self):

(19)

self.close()

app = QtGui.QApplication(sys.argv) myapp = MyWidget(None)

myapp.show() app.exec_()

Dla uproszczenia nasz program Hangman używa tylko małych liter. Lista słów, którą udostępniamy, ma tylko małe litery, a użytkownik musi wpisać jej przypuszczenia małymi literami. Funkcja dashes () b zastępuje litery myślnikami na początku nowej gry. Ale nie zastępuje interpunkcji, jak apostrofy. Więc jeśli słowo nie brzmi, gracz zobaczy - - - ”-. Zachęcam do samodzielnego tworzenia tego programu.

Możesz zbudować GUI w Qt Designer. Nie ma znaczenia, czy nie wygląda dokładnie tak samo, jak wersja, którą tutaj mam. Upewnij się tylko, że spojrzysz na kod, aby zobaczyć, jakich nazw używać do składników. Nazwy w kodzie muszą pasować do nazw w pliku .ui. Wpisz kod, jeśli możesz. Uruchom program i zobacz, jak to działa. A jeśli spróbujesz czegoś innego, spróbuj! Baw się dobrze, baw się z nim i eksperymentuj. To jedna z najbardziej zabawnych i satysfakcjonujących części programowania, i to właśnie nauczysz się najbardziej.

Czego się nauczyłeś?

■ Czym jest plik

■ Jak otwierać i zamykać pliki

■ Różne sposoby otwierania pliku: czytanie, pisanie i dołączanie

■ Różne sposoby zapisywania rzeczy do pliku: write () lub print >>

■ Jak używać pikli do zapisywania list i obiektów (i innych struktur danych Pythona) do pliku

■ Dużo o folderach (zwanych także katalogami), lokalizacjach plików i ścieżkach

Stworzyliśmy również grę Wisielec, która wykorzystywała dane z pliku, aby uzyskać listę słów.

Sprawdź swoją wiedzę

1 Rodzaj obiektu w Pythonie, który jest używany do pracy z plikami, nazywa się _______.

2 Jak utworzyć obiekt pliku?

3 Jaka jest różnica między obiektem pliku a nazwą pliku?

4 Co należy zrobić z plikiem po zakończeniu czytania lub pisania?

5 Co się stanie, jeśli otworzysz plik w trybie dołączania, a następnie napiszesz coś do pliku?

6 Co się stanie, jeśli otworzysz plik w trybie zapisu, a następnie napiszesz coś do pliku?

(20)

7 Jak zacząć czytać początek pliku po przeczytaniu jego części?

8 Jaka funkcja pickle jest używana do zapisania obiektu Python do pliku?

9 Jaka metoda piklowania jest używana do „usunięcia” obiektu - aby pobrać go z pliku pikli i umieścić go z powrotem w zmiennej Pythona?

Wypróbuj to

1 Zrób program do tworzenia głupich zdań. Każde zdanie powinno mieć co najmniej cztery części, takie jak ta:

__________ ___________ ____________ _____________

(przymiotnik) (rzeczownik) (fraza czasownikowa) (wyrażenie przysłówkowe)

Program powinien utworzyć zdanie, losowo wybierając przymiotnik, rzeczownik, frazę czasownika i frazę przysłówkową. Słowa będą przechowywane w plikach, a do ich tworzenia możesz użyć Notatnika.

Najprostszym sposobem na działanie tego programu jest posiadanie jednego pliku dla każdej z czterech grup słów, ale możesz to zrobić, jak chcesz. Oto kilka pomysłów na rozpoczęcie działalności, ale jestem pewien, że wymyślisz własne:

■ Przymiotniki: szalony, głupi, nieśmiały, głupkowaty, zły, leniwy, uparty, fioletowy

■ Rzeczowniki: małpa, słoń, rowerzysta, nauczyciel, autor, hokeista

■ Zwroty czasowników: grałem na ukulele, tańczyłem dżig, czesali włosy, trzepotali uszami

■ Wyrażenia przysłówkowe: na stole, w sklepie spożywczym, pod prysznicem, po śniadaniu, z miotłą Oto kolejny przykładowy przykład: „Leniwy autor przeczesał włosy miotłą”.

2 Napisz program, który prosi użytkownika o podanie jej imienia, wieku, ulubionego koloru i ulubionego jedzenia. Niech program zapisze wszystkie cztery elementy do pliku tekstowego, każdy w osobnej linii.

3 Zrób to samo, co w pytaniu nr 2, ale użyj pikli, aby zapisać dane w pliku. (Podpowiedź: będzie to łatwe, jeśli umieścisz dane na liście).

Cytaty

Powiązane dokumenty

w komunikowaniu się małych dzieci między sobą, a jedynie nietrafnie dobrane!. zadania

Zaznacz ołówkiem lub wskaż palcem ile znajduje się pisanek na obrazkach.. Wskaż palcem lub zaznacz ołówkiem

Przyszłość ta związana jest, jak się wydaje, z możliwością zachowania idei swoistości ludzkiej świadomości, działania i praktyki (jako jawnych dla samych siebie),

Kilku z nich przedstawi własne interpretacje – pozostali będą mogli się przekonać, jakie bogactwo znaczeń kryje się w wierszu i jak indywidualny może

Tezę tę sformułowano na podstawie analizy kondycji ekonomicznej i skłon- ności do inwestowania gospodarstw rolnych o wielkości 8 i więcej ESU, które znajdowały się w

Miesiąc - to pole precyzuje, za który miesiąc, za który naliczone są wpłaty (składki) korygowane w pliku. Informacja o tym, czy składka podstawowa za wybrany miesiąc

Dodatek ze względu na wiek automatycznie wypłacany jest po osiągnięciu kryterium wieku, nie musimy zatem składać wniosku.. O zasiłek wnioskujemy

Dla każdego pliku błędnego możliwe jest pobranie logu błędów w formacie .txt, który wskaże na numer linii (licząc od nagłówka) w pliku oraz opis błędu.