Działania na plikach

Do przygotowania przed zajęciami

* Python dla każdego. Podstawy programowania. – Michael Dawson – Helion **R** – Rozdział 8. Wprowadzenie. Koniec gry.

Cel i tematyka zajęć

Dzisiejsze laboratorium ma na celu zapoznanie Państwa z następującymi zagadnieniami:
* odczyt z pliku,
* zapis do pliku,
* zapis do pliku złożonych struktur danych.

– Zadanie przypominające

* Napisz funkcję, która jako argument przyjmuje liczbę i zwraca 1 jeśli liczba jest podzielna przez 3 i przez 5

Działania na plikach

Odczyt z pliku

Poniższy kod realizuje odczytanie z pliku i formacji.

# Odczytaj to
# Demonstruje odczytywanie danych z pliku tekstowego

print("Otwarcie i zamknięcie pliku.")
text_file = open("odczytaj_to.txt", "r")
text_file.close()


print("\nOdczytywanie znaków z pliku.")
text_file = open("odczytaj_to.txt", "r")
print(text_file.read(1))
print(text_file.read(7))
text_file.close()

Wczytywanie pliku do listy

Plik możemy wczytać do listy w następujący sposób:

print("\nWczytanie całego pliku do listy.")
text_file = open("odczytaj_to.txt", "r")
lines = text_file.readlines()
print(lines)
print(len(lines))
for line in lines:
print(line)
text_file.close()

Zapis do pliku

Poniższy kod realizuje zapis do pliku:

print("Utworzenie pliku tekstowego za pomocą metody write().")
text_file = open("zapisz_to.txt", "w")
text_file.write("Wiersz 1\n")
text_file.write("To jest wiersz 2\n")
text_file.write("Ten tekst tworzy wiersz 3\n")
text_file.close()

Zapisywanie list do pliku

Do pliku możemy zapisywać nie tylko łańcuchy znaków, ale i listy. Można to realizować w sposób następujący:

print("\nUtworzenie pliku tekstowego za pomocą metody writelines().")
text_file = open("zapisz_to.txt", "w")
lines = ["Wiersz 1\n",
"To jest wiersz 2\n",
"Ten tekst tworzy wiersz 3\n"]
text_file.writelines(lines)
text_file.close()

Zapisywanie struktur do pliku binarnego

Działanie na plikach tekstowych jest bardzo wygodne. Nie ma problemu z edytorami którymi możemy je edytować, jednak minusem wykorzystywania zwykłych plików tekstowych jest to, że możemy zapisywać jedynie łańcuchy znaków. Gdy zaś chcemy przechowywać bardziej złożone struktury w plikach stosujemy pliki binarne. Operacja przechowywana danych w pliku binarnym to konserwowanie i realizujemy ją w następujący sposób:

import pickle, shelve


print("Konserwowanie list.")
variety = ["łagodny", "pikantny", "kwaszony"]
shape = ["cały", "krojony wzdłuż", "w plasterkach"]
brand = ["Dawtona", "Klimex", "Vortumnus"]
f = open("pikle1.dat", "wb")
pickle.dump(variety, f)
pickle.dump(shape, f)
pickle.dump(brand, f)
f.close()

Korzystanie z zakonserwowanych danych

Aby skorzystać z danych umieszczonych w pliku binarnym należy zastosować następujący kod:

import pickle, shelve


print("\n Korzystanie z zakonserwowanych danych.")
f = open("pikle1.dat", "rb")
variety = pickle.load(f)
shape = pickle.load(f)
brand = pickle.load(f)
print(variety)
print(shape)
print(brand)
f.close()

Kolejnym sposobem przechowywania list i innych struktur tzw. odkładanie ich na półkę. Działanie takie realizujemy w następujący sposób:


import pickle, shelve

print("\nOdkładanie list na półkę.")
s = shelve.open("pikle2.dat")
s["odmiana"] = ["łagodny", "pikantny", "kwaszony"]
s["kształt"] = ["cały", "krojony wzdłuż", "w plasterkach"]
s["marka"] = ["Dawtona", "Klimex", "Vortumnus"]
s.sync() # upewnij się, że dane zostały zapisane


print("\nPobieranie list z pliku półki:")
print("marka -", s["marka"])
print("kształt -", s["kształt"])
print("odmiana -", s["odmiana"])
s.close()

Sprawdzanie czy plik istnieje

Aby sprawdzić czy plik istnieje należy skorzystać z modułu os.

import os


uprawnienia = 1
location_name = "las"
sciezkaDoPliku= location_name +".txt"
if os.path.isfile(sciezkaDoPliku) :
print("Tak")
else :
if uprawnienia == 1:
answer = input("Czy chcesz utworzyć ten plik?")
if answer.lower() == "tak":
print("Tworzę plik tej lokacji.")
text_file = open(sciezkaDoPliku, "w")
lines = []
text_location = input("Podaj opis lokacji. Jeśli chcesz prześć do nowej linii to użyj średnika: ")
lines = text_location.split(";")
lines = list(lines)
else:
print("No to nie")
else:
print("Przykro mi plik nie istnieje")

Zadania do samodzielnego wykonania na laboratoriach

* Napisz funkcję, której zadaniem będzie wyświetlać opis lokacji z Państwa gry, która jest zapisana w pliku tekstowym. Proszę jako nazwę pliku podać nazwę lokacji bez spacji i polskich znaków. (Lokacją jak już omawialiśmy na laboratoriach wprowadzających projekt może być np. las, karczma, itp.)
* Proszę zmodyfikować funkcję tworzenia postaci tak aby po zakończeniu tworzenia postaci struktura do której zapisywane są dane była konserwowana do pliku o nazwie nazwa_postaci.dat
* Napisz funkcję, która realizuje zachowanie stanu gry w czasie jej trwania. Trzyma następujące informacje – nazwa gracza, poziom, nazwa lokacji, numery rozwiązanych zadań. Podpowiedź skorzystaj z funkcji **shelve**

– Przykłady używane na laboratoriach

Przykłady pochodzą z książki
* Podstawową książką wykorzystywaną na laboratorium będzie: „Python dla każdego. Podstawy programowania Wydanie III”, autor Michael Dawson, Wydawnictwo Helion **(R)**

Zadanie domowe

**Wszystkie zadania domowe należy archiwizować ponieważ w dalszej części laboratoriów będziecie je Państwo rozbudowywać**
* Funkcję tworzenia postaci, którą zrealizowaliście Państwo na zajęciach zmodyfikuj tak aby wykorzystywała program z zadania domowego nr 2 w laboratorium nr 4 Listy słowniki…..
* Zrealizuj zapis stanu gry (napisz odpowiednią funkcję). Zapis stany gry ma zawierać: nazwa gracza, poziom, nazwa lokacji, numery rozwiązanych zadań. Stwórz funkcję wczytującą stan gry.
* Python dla każdego. Podstawy programowania. – Michael Dawson – Helion **R** – Rozdział 8.