Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:daten:processing [2023-05-26 14:27] – hof | gf_informatik:daten:processing [2026-06-01 10:14] (aktuell) – [Aufgabe 7] hof | ||
|---|---|---|---|
| Zeile 6: | Zeile 6: | ||
| Wieviel ist viel? 1000? | Wieviel ist viel? 1000? | ||
| + | |||
| #### Aufgabe 1 | #### Aufgabe 1 | ||
| Finde heraus, bei wie vielen Zeilen Excel oder Google Sheets in die Knie gehen. | Finde heraus, bei wie vielen Zeilen Excel oder Google Sheets in die Knie gehen. | ||
| + | |||
| + | ## Das Dateisystem | ||
| + | Alle Dateien sind im Permanentspeicher in einer _hierarchischen Ordnerstruktur_ abgelegt. Mit Python kann die Ordnerstruktur gelesen und manipuliert werden. Damit eine Datei gelesen oder beschrieben werden kann, muss sie zuerst geöffnet werden. | ||
| + | |||
| + | ### Absolute und relative Pfade | ||
| + | Ein _Dateipfad_ identifiziert eine Datei: | ||
| + | * ein _absoluter_ Pfad gibt die Ordner-Hierarchie vom obersten Knoten her an und beginnt mit einem Laufwerksbuchstaben oder einem Schrägstrich, | ||
| + | * ein _relativer_ Pfad identifiziert eine Datei von einem Referenz-Ordner her, oft vom Arbeits-Ordner des Programms. Wird das Programm im Ordner `C:/ | ||
| + | |||
| + | Es gibt zwei spezielle Pfadnamen: | ||
| + | * `.` der einzelne Punkt zeigt auf den aktuellen Arbeits-Ordner. | ||
| + | * `Meine_Dateien/ | ||
| + | * `..` zwei Punkte zeigen auf das Eltern-Verzeichnis: | ||
| + | * `Meine_Dateien/ | ||
| + | |||
| + | ### Dateinamen und Erweiterungen | ||
| + | Ein Dateiname (ohne den Ordnerpfad) hat meist eine durch einen Punkt abgetrennte _Erweiterung_, | ||
| + | * `beispiel.txt` -- eine Text-Datei | ||
| + | * `beispiel.pdf` -- eine PDF-Datei | ||
| + | * `beispiel.xlsx` -- eine Microsoft-Excel-Tabelle | ||
| + | |||
| + | Windows versteckt die Erweiterung standardmässig, | ||
| + | |||
| + | ### Dateioperationen mit Python | ||
| + | Mit `os.listdir` können wir die Dateien im momentanen Arbeitsverzeichnis auflisten: | ||
| + | |||
| + | < | ||
| + | from os import listdir | ||
| + | |||
| + | print(listdir()) | ||
| + | </ | ||
| ## Dateien einlesen | ## Dateien einlesen | ||
| Grossen Datenmengen sind natürlich nur ein Grund, weshalb wir mit einem Programm Daten lesen und schreiben wollen. Andere Gründe: wir wollen Benutzerdaten lesen oder speichern können, den Programmzustand abspeichern (und beim Neustart wieder einlesen), etc. | Grossen Datenmengen sind natürlich nur ein Grund, weshalb wir mit einem Programm Daten lesen und schreiben wollen. Andere Gründe: wir wollen Benutzerdaten lesen oder speichern können, den Programmzustand abspeichern (und beim Neustart wieder einlesen), etc. | ||
| Wie lesen wir Daten in einer Text-Datei? | Wie lesen wir Daten in einer Text-Datei? | ||
| - | + | ||
| - | <code python> | + | <bottom-editor id=" |
| # Opens a file for reading (and closes it again after the ' | # Opens a file for reading (and closes it again after the ' | ||
| - | with open('dateiname.txt', ' | + | with open('beispiel.txt', ' |
| count = 0 | count = 0 | ||
| # Loops over all lines in the file | # Loops over all lines in the file | ||
| Zeile 22: | Zeile 54: | ||
| count += 1 | count += 1 | ||
| print(count) | print(count) | ||
| - | </code> | + | </bottom-editor> |
| * Wenn Dateien gelesen oder geschrieben werden, müssen sie beim Betriebssystem reserviert werden. Mit `with` wird sichergestellt, | * Wenn Dateien gelesen oder geschrieben werden, müssen sie beim Betriebssystem reserviert werden. Mit `with` wird sichergestellt, | ||
| - | * Die Datei (hier ' | + | * Die Datei (hier `beispiel.txt`) muss sich im Ordner befinden, wo Python |
| * `' | * `' | ||
| + | |||
| #### Aufgabe 2 | #### Aufgabe 2 | ||
| - | Lade die Datei [[https:// | + | Lade die Datei [[https:// |
| - | . | + | |
| + | Alternativ dazu kannst du auch direkt obigen Code modifizieren - die Datei `gemeinden.csv` ist bereits hinterlegt. | ||
| + | |||
| + | ##### Encoding | ||
| + | Achtung, Mac-Users: Die Datei verwendet in Mitteleuropa die Latin1-Codierung, | ||
| + | |||
| + | <code python> | ||
| + | # Specify text encoding when opening a file. | ||
| + | with open(' | ||
| + | </ | ||
| ## Dateien schreiben | ## Dateien schreiben | ||
| Schreiben funktioniert ganz ähnlich wie lesen, aber als zweites Argument muss `' | Schreiben funktioniert ganz ähnlich wie lesen, aber als zweites Argument muss `' | ||
| Zeile 50: | Zeile 93: | ||
| Beschreibe eine Datei mit einigen Zeilen. Es ist ungünstig, mehr als einige zehntausend Zeilen zu schreiben... | Beschreibe eine Datei mit einigen Zeilen. Es ist ungünstig, mehr als einige zehntausend Zeilen zu schreiben... | ||
| ## CSV-Format | ## CSV-Format | ||
| - | Die Datei `gemeinden.csv` ist im [[wpde> | + | Die Datei `gemeinden.csv` ist im [[wpde> |
| - | Oft werden in der ersten Zeile die Namen der abgespeicherten Werte festgelegt: | + | Oft werden in der ersten Zeile die Spaltennamen |
| <code csv> | <code csv> | ||
| Zeile 64: | Zeile 107: | ||
| * `split(char)` erzeugt aus einem String eine Liste von Werten, die mit dem angegebenen Trennzeichen abgetrennt sind: | * `split(char)` erzeugt aus einem String eine Liste von Werten, die mit dem angegebenen Trennzeichen abgetrennt sind: | ||
| * `" | * `" | ||
| - | * `strip()` gibt den selben String zurück, aber ohne Leerschläge an beiden Enden. | + | * `strip()` gibt den selben String zurück, aber ohne Leerschläge |
| + | * `" | ||
| Zeile 74: | Zeile 118: | ||
| * Wieviele Gemeinden gibt es im Kanton Thurgau? Wieviele im Kanton Bern? | * Wieviele Gemeinden gibt es im Kanton Thurgau? Wieviele im Kanton Bern? | ||
| + | < | ||
| + | <script type=" | ||
| + | with open(' | ||
| + | # Alle Zeilen durchlaufen. | ||
| + | # Jede Zeile mit split() aufteilen | ||
| + | # Der Kanton ist an der zweiten Stelle, also am Index 1. | ||
| + | pass | ||
| + | </ | ||
| + | <script type=" | ||
| + | with open(' | ||
| + | be = 0 | ||
| + | tg = 0 | ||
| + | for line in infile: | ||
| + | tokens = line.split(',' | ||
| + | canton = tokens[1] | ||
| + | if canton == ' | ||
| + | tg = tg + 1 | ||
| + | elif canton == ' | ||
| + | be = be + 1 | ||
| + | print(" | ||
| + | print(" | ||
| + | </ | ||
| + | </ | ||
| ## Text in Zahlen umwandeln. | ## Text in Zahlen umwandeln. | ||
| Zeile 83: | Zeile 150: | ||
| Allerdings funktioniert das nur, wenn der String auch wirklich eine Zahl darstellt. Sonst wird eine *Exception* geworfen; wir können sie mit `try...except` auffangen: | Allerdings funktioniert das nur, wenn der String auch wirklich eine Zahl darstellt. Sonst wird eine *Exception* geworfen; wir können sie mit `try...except` auffangen: | ||
| - | <code python> | + | <bottom-editor id=" |
| try: | try: | ||
| my_number = int(" | my_number = int(" | ||
| print(my_number) | print(my_number) | ||
| except ValueError: | except ValueError: | ||
| - | | + | |
| - | </code> | + | </bottom-editor> |
| #### Aufgabe 5 | #### Aufgabe 5 | ||
| Benütze `try...except` um in deinem Code die Bevölkerung und die Fläche der Gemeinden auszulesen. | Benütze `try...except` um in deinem Code die Bevölkerung und die Fläche der Gemeinden auszulesen. | ||
| * welche Spalten (Indices) gehören zu diesen Werten? | * welche Spalten (Indices) gehören zu diesen Werten? | ||
| * verwendest du `int()` oder `float()`? | * verwendest du `int()` oder `float()`? | ||
| + | * wie gross ist die Bevölkerung des Kanton Thurgau? | ||
| + | < | ||
| + | <script type=" | ||
| + | with open(' | ||
| + | pass | ||
| + | </ | ||
| + | <script type=" | ||
| + | with open(' | ||
| + | tg = 0 | ||
| + | for line in infile: | ||
| + | tokens = line.split(',' | ||
| + | canton = tokens[1] | ||
| + | try: | ||
| + | population = int(tokens[2]) | ||
| + | area = float(tokens[3]) | ||
| + | if canton == ' | ||
| + | tg = tg + population | ||
| + | except ValueError: | ||
| + | print(" | ||
| + | print(" | ||
| + | </ | ||
| + | </ | ||
| #### Aufgabe 6 | #### Aufgabe 6 | ||
| Schreibe Python-Code, | Schreibe Python-Code, | ||
| Zeile 106: | Zeile 193: | ||
| * kleinste Bevölkerung: | * kleinste Bevölkerung: | ||
| * grösste Fläche: Scuol ($438.76 km^2$) | * grösste Fläche: Scuol ($438.76 km^2$) | ||
| - | * Einwohner: $8670125$ | + | * Einwohner: $9050451$ |
| ++++ | ++++ | ||
| - | <nodisp 2> | + | <bottom-exercise id=" |
| - | ++++Code:| | + | <script type=" |
| - | <code python> | + | def find_smallest_population(): |
| + | """ | ||
| + | </ | ||
| + | <script type=" | ||
| def find_smallest_population(): | def find_smallest_population(): | ||
| with open(' | with open(' | ||
| + | # Search for the smallest, so start out with a value larger than any expected. | ||
| min_pop = 1000000 | min_pop = 1000000 | ||
| town = None | town = None | ||
| Zeile 119: | Zeile 210: | ||
| cells = line.split(',' | cells = line.split(',' | ||
| try: | try: | ||
| + | # Population is in the third column, and it is an integer. | ||
| population = int(cells[2]) | population = int(cells[2]) | ||
| if population < min_pop: | if population < min_pop: | ||
| + | # We found a town smaller than the currently known smallest. | ||
| min_pop = population | min_pop = population | ||
| town = cells[0] | town = cells[0] | ||
| Zeile 128: | Zeile 221: | ||
| print(" | print(" | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | <script type=" | ||
| + | def find_largest_area(): | ||
| + | """ | ||
| + | </ | ||
| + | <script type=" | ||
| def find_largest_area(): | def find_largest_area(): | ||
| with open(' | with open(' | ||
| + | # We search for the largest, so start with a small value. | ||
| max_area = 0 | max_area = 0 | ||
| town = None | town = None | ||
| Zeile 136: | Zeile 238: | ||
| cells = line.split(',' | cells = line.split(',' | ||
| try: | try: | ||
| + | # Area is in the fourth column, and it is a floating point number. | ||
| area = float(cells[3]) | area = float(cells[3]) | ||
| if area > max_area: | if area > max_area: | ||
| + | # Found a town with larger area than the largest known so far. | ||
| max_area = area | max_area = area | ||
| town = cells[0] | town = cells[0] | ||
| Zeile 145: | Zeile 249: | ||
| print(" | print(" | ||
| - | </code> | + | </script> |
| - | ++++ | + | </bottom-exercise> |
| - | </nodisp> | + | |
| #### Aufgabe 7 | #### Aufgabe 7 | ||
| Erweitere den Code, um folgende Fragen zu beantworten: | Erweitere den Code, um folgende Fragen zu beantworten: | ||
| Zeile 155: | Zeile 257: | ||
| * Wieviele Gemeinden hat der Kanton Glarus? | * Wieviele Gemeinden hat der Kanton Glarus? | ||
| - | <nodisp 2> | + | |
| - | ++++Code:| | + | <bottom-exercise id=" |
| - | <code python> | + | <script type=" |
| + | def summarize_canton(canton): | ||
| + | """ | ||
| + | </ | ||
| + | <script type=" | ||
| def summarize_canton(canton): | def summarize_canton(canton): | ||
| with open(' | with open(' | ||
| Zeile 211: | Zeile 317: | ||
| summarize_canton(' | summarize_canton(' | ||
| summarize_canton(' | summarize_canton(' | ||
| - | </code> | + | </script> |
| - | ++++ | + | </bottom-exercise> |
| - | </nodisp> | + | |
| ### Nächstes Kapitel | ### Nächstes Kapitel | ||
| Weiter mit [[gf_informatik: | Weiter mit [[gf_informatik: | ||