Python-Dict und -Datei

Dict-Hash-Tabelle

Die effiziente Hash-Tabellenstruktur von Python wird als „Dict“ bezeichnet. Der Inhalt eines Diktats kann als eine Reihe von Schlüssel/Wert-Paaren in geschweiften Klammern { } geschrieben werden, z.B. dict = {key1:value1, key2:value2, ... }. Das "leere Dictionary" ist ein leeres Paar geschweifter Klammern {}.

Beim Suchen oder Festlegen eines Werts in einem Wörterbuch werden eckige Klammern verwendet, z.B. sucht dict['foo'] nach dem Wert unter dem Schlüssel „foo“. Strings, Zahlen und Tupel dienen als Schlüssel und jeder Typ kann ein Wert sein. Andere Typen funktionieren möglicherweise nicht richtig als Schlüssel (Strings und Tupel funktionieren einwandfrei, da sie unveränderlich sind). Die Suche nach einem Wert, der nicht im Wörterbuch enthalten ist, löst einen KeyError aus. Verwenden Sie "in", um zu überprüfen, ob sich der Schlüssel im Wörterbuch befindet, oder verwenden Sie "dict.get(key)", das den Wert zurückgibt, oder "None", wenn der Schlüssel nicht vorhanden ist (oder mit "get(key, not-found)" können Sie angeben, welcher Wert im nicht gefundenen Fall zurückgegeben werden soll.

  ## 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)

Wörterbuch mit den Schlüsseln „a“ „o“ „g“

Eine For-Schleife in einem Wörterbuch durchläuft standardmäßig die Schlüssel. Die Schlüssel werden in einer beliebigen Reihenfolge angezeigt. Die Methoden dict.keys() und dict.values() geben explizit Listen der Schlüssel oder Werte zurück. Es gibt auch ein items() , das eine Liste von Tupeln (Schlüssel, Wert) zurückgibt. Dies ist die effizienteste Methode, um alle Schlüsselwertdaten im Wörterbuch zu untersuchen. Alle diese Listen können an die Funktion „ sorted()“ übergeben werden.

  ## 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

Hinweis zur Strategie: Was die Leistung angeht, ist das Wörterbuch eines Ihrer besten Tools und Sie sollten es dort verwenden, wo es Ihnen leichtfällt, Daten zu organisieren. Sie können beispielsweise eine Protokolldatei lesen, in der jede Zeile mit einer IP-Adresse beginnt, und die Daten in einem Wörterbuch mit der IP-Adresse als Schlüssel und der Liste der Zeilen speichern, in denen sie als Wert angezeigt werden. Sobald Sie die gesamte Datei gelesen haben, können Sie nach einer beliebigen IP-Adresse suchen und sofort die Zeilenliste sehen. Das Wörterbuch nimmt verstreute Daten auf und macht sie kohärent.

Dict-Formatierung

Der %-Operator ist eine bequeme Möglichkeit, Werte aus einem Dictionary durch einen Namen in einen String zu ersetzen:

  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

Mit dem Operator "del" werden Löschungen durchgeführt. Im einfachsten Fall kann die Definition einer Variablen entfernt werden, so als wäre diese Variable nicht definiert worden. Entf kann auch für Listenelemente oder -segmente verwendet werden, um diesen Teil der Liste sowie Einträge aus einem Wörterbuch zu löschen.

  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

Die Funktion open() wird geöffnet und gibt ein Datei-Handle zurück, das zum Lesen oder Schreiben einer Datei wie gewohnt verwendet werden kann. Mit dem Code f = open('name', 'r') wird die Datei in der Variablen f geöffnet, die für Leseoperationen bereit ist. Wenn Sie fertig sind, verwenden Sie f.close(). Verwenden Sie statt „r“ das Wort „w“ zum Schreiben und „a“ zum Anhängen. Der Standard „for-Loop“ funktioniert bei Textdateien und iteriert über die Zeilen der Datei. Dies funktioniert nur bei Textdateien, nicht bei Binärdateien. Die for-Loop-Technik ist eine einfache und effiziente Möglichkeit, um sich alle Zeilen in einer Textdatei anzusehen:

  # 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()

Das Lesen einer Zeile nach der anderen hat die schöne Qualität, dass nicht alle Dateien gleichzeitig in den Speicher passen müssen – praktisch, wenn Sie sich jede Zeile in einer 10-Gigabyte-Datei ansehen möchten, ohne 10 Gigabyte Speicher zu verbrauchen. Die Methode f.readlines() liest die gesamte Datei in den Speicher und gibt ihren Inhalt als Liste seiner Zeilen zurück. Die Methode f.read() liest die gesamte Datei in einen einzigen String, was eine praktische Möglichkeit sein kann, um den gesamten Text auf einmal zu verarbeiten, z. B. mit regulären Ausdrücken, die wir später behandeln werden.

Beim Schreiben stellt die Methode f.write(string) die einfachste Möglichkeit dar, Daten in eine offene Ausgabedatei zu schreiben. Alternativ können Sie „print“ mit einer geöffneten Datei wie „print(string, file=f)“ verwenden.

Dateien im Unicode-Format

Um Unicode-codierte Dateien zu lesen und zu schreiben, verwenden Sie einen „t“-Modus und geben Sie explizit eine Codierung an:


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'

Inkrementelle Entwicklung trainieren

Wenn Sie ein Python-Programm erstellen, schreiben Sie nicht alles in einem Schritt. Legen Sie stattdessen nur einen ersten Meilenstein fest, z.B. „Der erste Schritt besteht darin, die Liste der Wörter zu extrahieren.“ Schreiben Sie den Code, um zu diesem Meilenstein zu gelangen, und drucken Sie an diesem Punkt Ihre Datenstrukturen aus. Anschließend können Sie sys.exit(0) ausführen, damit das Programm nicht zu den nicht abgeschlossenen Teilen überläuft. Sobald der Code für den Meilenstein funktioniert, können Sie ihn für den nächsten Meilenstein bearbeiten. Wenn Sie den Ausdruck Ihrer Variablen in einem Zustand ansehen können, können Sie darüber nachdenken, wie Sie diese Variablen transformieren müssen, um zum nächsten Status zu gelangen. Python funktioniert mit diesem Muster sehr schnell, sodass Sie eine kleine Änderung vornehmen und das Programm ausführen können, um zu sehen, wie es funktioniert. Nutzen Sie diese schnelle Bearbeitungszeit und erstellen Sie Ihr Programm in wenigen Schritten.

Übung: Wordcount.py

Wenn Sie alle grundlegenden Python-Materialien (Strings, Listen, Wörterbücher, Tupel, Dateien) kombinieren, versuchen Sie es mit der zusammenfassenden Übung wordcount.py in den Grundlagenübungen.