Dyktowanie i plik w Pythonie

Tabela haszowania dykta

Efektywna struktura tabeli skrótów klucz-wartość w Pythonie jest nazywana „dyktem”. Treść dyktatu może być zapisana jako seria par klucz:wartość w nawiasach klamrowych { }, np. dykt = {klucz1:wartość1, klucz2:wartość2, ... }. „Pusty dykt” to po prostu pusta para nawiasów klamrowych {}.

Do wyszukiwania lub ustawiania wartości w dyktatu używa się nawiasów kwadratowych, np. dict['foo'] wyszukuje wartość pod kluczem „foo”. Ciągi, liczby i kropki działają jak klucze, a każdy typ może być wartością. Inne typy mogą lub nie działać prawidłowo, ponieważ klucze (ciągi i krotki działają prawidłowo, ponieważ są stałe). Odszukanie wartości, której nie ma w dyktacie, powoduje wystąpienie błędu klucza. Użyj słowa „in”, aby sprawdzić, czy klucz znajduje się w dyktacie, lub użyj metody dict.get(key), która zwraca wartość, lub „None” (brak), jeśli klucz nie jest obecny (lub get(key, not-found) pozwala określić wartość do zwrócenia w przypadku braku wartości).

  ## Can build up a dict by starting with the empty dict {}
  ## and storing key/value pairs into the dict like this:
  ## dict[key] = value-for-that-key
  dict = {}
  dict['a'] = 'alpha'
  dict['g'] = 'gamma'
  dict['o'] = 'omega'

  print(dict) ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'}

  print(dict['a'])     ## Simple lookup, returns 'alpha'
  dict['a'] = 6       ## Put new key/value into dict
  'a' in dict         ## True
  ## print(dict['z'])                  ## Throws KeyError
  if 'z' in dict: print(dict['z'])     ## Avoid KeyError
  print(dict.get('z'))  ## None (instead of KeyError)

podyktuj z klawiszami „a”, „o” „g”

Pętla for w słowniku powtarza się domyślnie nad kluczami. Klucze pojawią się w dowolnej kolejności. Metody dict.keys() i dict.values() zwracają jawnie listę kluczy lub wartości. Dostępna jest też funkcja items(), która zwraca listę krotek (klucz, wartość), co jest najskuteczniejszym sposobem badania wszystkich danych par klucz-wartość w słowniku. Wszystkie te listy można przekazać do funkcji sort().

  ## By default, iterating over a dict iterates over its keys.
  ## Note that the keys are in a random order.
  for key in dict:
    print(key)
  ## prints a g o

  ## Exactly the same as above
  for key in dict.keys():
    print(key)

  ## Get the .keys() list:
  print(dict.keys())  ## dict_keys(['a', 'o', 'g'])

  ## Likewise, there's a .values() list of values
  print(dict.values())  ## dict_values(['alpha', 'omega', 'gamma'])

  ## Common case -- loop over the keys in sorted order,
  ## accessing each key/value
  for key in sorted(dict.keys()):
    print(key, dict[key])

  ## .items() is the dict expressed as (key, value) tuples
  print(dict.items())  ##  dict_items([('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')])

  ## This loop syntax accesses the whole dict by looping
  ## over the .items() tuple list, accessing one (key, value)
  ## pair on each iteration.
  for k, v in dict.items(): print(k, '>', v)
  ## a > alpha    o > omega     g > gamma

Uwaga dotycząca strategii: z punktu widzenia wydajności słownik jest jednym z najlepszych narzędzi i należy go używać w celu łatwego porządkowania danych. Na przykład możesz odczytać plik dziennika, w którym każdy wiersz zaczyna się od adresu IP, i zapisać dane w dyktacie, używając adresu IP jako klucza oraz listy wierszy, w których dane te występują jako wartość. Po przeczytaniu całego pliku możesz wyszukać dowolny adres IP i natychmiast zobaczyć listę jego wierszy. Słownik zbiera rozproszone dane i tworzy z nich coś spójnego.

Formatowanie dykta

Operator % w wygodny sposób zastępuje wartości z dyktatu w ciągu znaków według nazwy:

  h = {}
  h['word'] = 'garfield'
  h['count'] = 42
  s = 'I want %(count)d copies of %(word)s' % h  # %d for int, %s for string
  # 'I want 42 copies of garfield'

  # You can also use str.format().
  s = 'I want {count:d} copies of {word}'.format(h)

Del

Operator „del” usuwa informacje. W najprostszym przypadku może to usunąć definicję zmiennej, jak gdyby ta zmienna nie została zdefiniowana. Można ich również używać w przypadku elementów listy lub wycinków w celu usunięcia danej części listy oraz wpisów ze słownika.

  var = 6
  del var  # var no more!

  list = ['a', 'b', 'c', 'd']
  del list[0]     ## Delete first element
  del list[-2:]   ## Delete last two elements
  print(list)      ## ['b']

  dict = {'a':1, 'b':2, 'c':3}
  del dict['b']   ## Delete 'b' entry
  print(dict)      ## {'a':1, 'c':3}

Files

Funkcja open() otwiera się i zwraca uchwyt pliku, którego można używać do odczytu lub zapisu pliku. Kod f = open('name', 'r') otwiera plik w zmiennej f, gotowy do operacji odczytu i po zakończeniu używa funkcji f.close(). Zamiast „r” użyj „w” do pisania i „a” do dołączenia. Standardowa pętla for-loop działa w przypadku plików tekstowych, iterująca się w kolejnych wierszach pliku (działa tylko w przypadku plików tekstowych, a nie binarnych). Metoda pętli to prosty i skuteczny sposób na sprawdzenie wszystkich wierszy w pliku tekstowym:

  # Echo the contents of a text file
  f = open('foo.txt', 'rt', encoding='utf-8')
  for line in f:   ## iterates over the lines of the file
    print(line, end='')    ## end='' so print does not add an end-of-line char
                           ## since 'line' already includes the end-of-line.
  f.close()

Czytanie pojedynczych wierszy ma dobrą jakość, ale nie wszystkie pliki muszą się jednocześnie zmieścić w pamięci. Jest to przydatne, gdy chcesz przejrzeć wszystkie wiersze w pliku o rozmiarze 10 GB bez wykorzystywania 10 GB pamięci. Metoda f.readlines() odczytuje cały plik do pamięci i zwraca jego zawartość jako listę jego wierszy. Metoda f.read() odczytuje cały plik do pojedynczego ciągu, co może być przydatnym sposobem jednocześnie obsługi całego tekstu, na przykład w przypadku wyrażeń regularnych, które zobaczysz później.

Najłatwiejszym sposobem zapisu danych w otwartym pliku wyjściowym jest f.write(string) Możesz też użyć polecenia „print” w otwartym pliku, np. „print(ciąg, plik=f)”.

Unicode plików

Aby odczytywać i zapisywać pliki zakodowane w formacie Unicode, użyj trybu „t” i jawnie określ kodowanie:


with open('foo.txt', 'rt', encoding='utf-8') as f:
  for line in f:
    # here line is a *unicode* string

with open('write_test', encoding='utf-8', mode='wt') as f:
    f.write('\u20ACunicode\u20AC\n') #  €unicode€
    # AKA print('\u20ACunicode\u20AC', file=f)  ## which auto-adds end='\n'

Rozwój przyrostowy ćwiczeń

Jeśli tworzysz program w Pythonie, nie pisz wszystkiego od razu w jednym kroku. Zamiast tego określ tylko pierwszy krok milowy, np. „No dobrze, pierwszym krokiem jest wyodrębnienie listy słów”. Napisz kod, aby przejść do tego kamienia milowego, i w tym momencie wydrukuj struktury danych. Następnie możesz zastosować polecenie sys.exit(0), dzięki któremu program nie będzie wchodzić na kolejne części. Gdy kod kamienia milowego będzie działać, możesz zająć się kodem dla następnego etapu. Możliwość przeglądania wyników zmiennych w jednym stanie może ułatwić Ci zastanowienie się, jak przekształcić te zmienne, aby przejść do kolejnego stanu. Python używa tego wzorca bardzo szybko, dzięki czemu możesz wprowadzić niewielką zmianę i uruchomić program, aby sprawdzić, jak działa. Skorzystaj z tej szybkiej realizacji i stwórz swój program w kilku prostych krokach.

Ćwiczenie: wordcount.py

Po połączeniu całego podstawowego materiału Pythona – ciągów, list, słowników, krotek, plików – spróbuj podsumować ćwiczenie wordcount.py w ramach ćwiczeń podstawowych.