Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:daten:processing [2023-05-26 14:27] – hofgf_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, z.B. `C:/Users/Nutzername/Meine_Dateien/beispiel.txt` oder `/Users/Nutzername/Downloads/beispiel.txt`.
 +  * ein _relativer_ Pfad identifiziert eine Datei von einem Referenz-Ordner her, oft vom Arbeits-Ordner des Programms. Wird das Programm im Ordner `C:/Users/Nutzername` ausgeführt, so zeigt der relative Pfad `Meine_Dateien/beispiel.txt` auf die gleiche Datei wie oben.
 +
 +Es gibt zwei spezielle Pfadnamen:
 +  * `.` der einzelne Punkt zeigt auf den aktuellen Arbeits-Ordner.
 +    * `Meine_Dateien/beispiel.txt` und `./Meine_Dateien/beispiel.txt` zeigen auf die gleiche Datei.
 +  * `..` zwei Punkte zeigen auf das Eltern-Verzeichnis:
 +    * `Meine_Dateien/../beispiel.txt` zeigt auf `beispiel.txt` im aktuellen Ordner.
 +
 +### Dateinamen und Erweiterungen
 +Ein Dateiname (ohne den Ordnerpfad) hat meist eine durch einen Punkt abgetrennte _Erweiterung_, die den Typ der Datei anzeigt:
 +  * `beispiel.txt` -- eine Text-Datei
 +  * `beispiel.pdf` -- eine PDF-Datei
 +  * `beispiel.xlsx` -- eine Microsoft-Excel-Tabelle
 +
 +Windows versteckt die Erweiterung standardmässig, es empfiehlt sich, [[https://support.microsoft.com/de-de/windows/allgemeine-dateierweiterungen-in-windows-da4a4430-8e76-89c5-59f7-1cdbbc75cb01|sie anzuzeigen]].
 +
 +### Dateioperationen mit Python
 +Mit `os.listdir` können wir die Dateien im momentanen Arbeitsverzeichnis auflisten:
 +
 +<bottom-editor id="listdir" session="read" zip="https://bottom.ch/ksr/2m/data/2m.zip">
 +from os import listdir
 +
 +print(listdir())
 +</bottom-editor>
 ## 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="read" session="read" zip="https://bottom.ch/ksr/2m/data/2m.zip">
 # Opens a file for reading (and closes it again after the 'with'). # Opens a file for reading (and closes it again after the 'with').
-with open('dateiname.txt', 'r') as infile:+with open('beispiel.txt', 'r') as infile:
     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, dass die Datei nicht offen bleibt sondern nach dem Lesevorgang wieder geschlossen wird.    * Wenn Dateien gelesen oder geschrieben werden, müssen sie beim Betriebssystem reserviert werden. Mit `with` wird sichergestellt, dass die Datei nicht offen bleibt sondern nach dem Lesevorgang wieder geschlossen wird.
-   * Die Datei (hier 'dateiname.txt') muss sich im gleichen Ordner befinden wie die Python-Datei.+   * Die Datei (hier `beispiel.txt`) muss sich im Ordner befinden, wo Python ausgeführt wird.
    * `'r'` bedeutet *read*, dass die Textdatei nur gelesen und nicht verändert wird.    * `'r'` bedeutet *read*, dass die Textdatei nur gelesen und nicht verändert wird.
 +
  
 #### Aufgabe 2 #### Aufgabe 2
  
-Lade die Datei [[https://kantonsschuleromanshorn.sharepoint.com/:f:/s/FSInformatik/Ek-Hi_stH2RMjDa-wQN9jekBMeF_YD6rvhmibDlNglGWxw?e=Y3AX65|gemeinden.csv]] herunter und speichere sie im Ordner, wo du dein Python-Programm abspeicherst. Verwende obigen Python-Code, um herauszufinden, wieviel Zeilen die Datei hat +Lade die Datei [[https://kantonsschuleromanshorn.sharepoint.com/:f:/s/FSInformatik/Ek-Hi_stH2RMjDa-wQN9jekBMeF_YD6rvhmibDlNglGWxw?e=Y3AX65|gemeinden.csv]] herunter und speichere sie im Ordner, wo du dein Python-Programm abspeicherst. Verwende obigen Python-Code, um herauszufinden, wieviele Zeilen die Datei hat. 
-.+ 
 +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, einer Erweiterung von [[gf_informatik:verschluesselung:codierung|ASCII]], um auch Umlaute anzeigen zu können. Diese ist in Windows voreingestellt. MacOS hingegen verwendet standardmässig die universelle Unicode (UTF-8) Codierung. Beim Öffnen der Datei kann die Abweichung korrigiert werden: 
 + 
 +<code python> 
 +# Specify text encoding when opening a file. 
 +with open('dateiname.txt', 'r', encoding='latin1') as infile: 
 +</code> 
 ## Dateien schreiben ## Dateien schreiben
 Schreiben funktioniert ganz ähnlich wie lesen, aber als zweites Argument muss `'w'` (für _write_) angegeben werden: Schreiben funktioniert ganz ähnlich wie lesen, aber als zweites Argument muss `'w'` (für _write_) angegeben werden:
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>CSV_(Dateiformat)|Comma-Separated-Values]] Format gespeichert: Die Daten sind ganz ähnlich gespeichert wie in einer Tabelle und können auch mit Excel und Sheets geöffnet werden. Jede Zeile entspricht einer Zeile der Tabelle; die Spalten sind meist mit Kommas voneinander getrennt. Manchmal werden aber auch Semikolons oder ein Tabulator (`\t`) als Trennzeichen verwendet.+Die Datei `gemeinden.csv` ist im [[wpde>CSV_(Dateiformat)|Comma-Separated-Values]] Format gespeichert: Die Daten sind ganz ähnlich gespeichert wie in einer Tabelle und können auch mit Excel und Sheets geöffnet werden. Jede Zeile entspricht einer Zeile der Tabelle; die Spalten sind meist mit Kommas voneinander getrennt. Manchmal werden aber auch Semikolons (`;`) oder ein [[wpde>Tabulatorzeichen|Tabulator]] (`\t`) als Trennzeichen verwendet.
  
-Oft werden in der ersten Zeile die Namen der abgespeicherten Werte festgelegt:+Oft werden in der ersten Zeile die Spaltennamen festgelegt:
  
 <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:
     * `"Aarau,AG,21726,12.36".split(',')` erzeugt die Liste `["Aarau","AG","21726","12.36"]`     * `"Aarau,AG,21726,12.36".split(',')` erzeugt die Liste `["Aarau","AG","21726","12.36"]`
-  * `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 oder anderen _Whitespace_ (Zeilenumbrüche...) an beiden Enden: 
 +    * `"  Romans Horn  ".strip()` gibt `"Romans Horn"` zurück.
  
  
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?
  
 +<bottom-exercise showsolution id="count" zip="https://bottom.ch/ksr/2m/data/2m.zip">
 +<script type="text/x-starter">
 +with open('gemeinden.csv', 'r') as infile:
 +    # Alle Zeilen durchlaufen.
 +    # Jede Zeile mit split() aufteilen
 +    # Der Kanton ist an der zweiten Stelle, also am Index 1.
 +    pass
 +</script>
 +<script type="text/x-solution">
 +with open('gemeinden.csv', 'r') as infile:
 +    be = 0
 +    tg = 0
 +    for line in infile:
 +        tokens = line.split(',')
 +        canton = tokens[1]
 +        if canton == 'TG':
 +            tg = tg + 1
 +        elif canton == 'BE':
 +            be = be + 1
 +    print("Bern", be)
 +    print("Thurgau", tg)
 +</script>
 +</bottom-exercise>
  
 ## 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: try:
     my_number = int("abc")  # may throw an exception     my_number = int("abc")  # may throw an exception
     print(my_number)        # only executes if the above was successful     print(my_number)        # only executes if the above was successful
 except ValueError: except ValueError:
-    pass                    # executed if an exception was thrown +    print("not a number")   # executed if an exception was thrown 
-</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?
  
 +<bottom-exercise showsolution id="sum-tg" zip="https://bottom.ch/ksr/2m/data/2m.zip"> 
 +<script type="text/x-starter"> 
 +with open('gemeinden.csv', 'r') as infile: 
 +    pass 
 +</script> 
 +<script type="text/x-solution"> 
 +with open('gemeinden.csv', 'r') as infile: 
 +    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 = tg + population 
 +        except ValueError: 
 +            print("Ignoring line: ", line) 
 +    print("Bevölkerung TG", tg) 
 +</script> 
 +</bottom-exercise>
 #### Aufgabe 6 #### Aufgabe 6
 Schreibe Python-Code, um die folgenden Fragen zu beantworten: Schreibe Python-Code, um die folgenden Fragen zu beantworten:
Zeile 106: Zeile 193:
   * kleinste Bevölkerung: Kammersrohr (32 Einwohner)   * kleinste Bevölkerung: Kammersrohr (32 Einwohner)
   * 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="find-smallest" showsolution zip="https://bottom.ch/ksr/2m/data/2m.zip" style="max-height:18lh;"> 
-++++Code:| +<script type="text/x-starter"> 
-<code python>+def find_smallest_population(): 
 +    """Gibt die bevölkerungsmässig kleinste Gemeinde und ihre Bevölkerungszahl zurück.""" 
 +</script> 
 +<script type="text/x-solution">
 def find_smallest_population(): def find_smallest_population():
     with open('gemeinden.csv') as towns:     with open('gemeinden.csv') as towns:
 +        # 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("Smallest town: ", find_smallest_population()) print("Smallest town: ", find_smallest_population())
 +</script>
 +</bottom-exercise>
  
 +<bottom-exercise id="find-largest" showsolution zip="https://bottom.ch/ksr/2m/data/2m.zip" style="max-height:18lh;">
 +<script type="text/x-starter">
 +def find_largest_area():
 +    """Gibt die flächenmässig grösste Gemeinde und ihre Fläche zurück."""
 +</script>
 +<script type="text/x-solution">
 def find_largest_area(): def find_largest_area():
     with open('gemeinden.csv') as towns:     with open('gemeinden.csv') as towns:
 +        # 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("Largest area", find_largest_area()) print("Largest area", find_largest_area())
-</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="summarize-canton" showsolution zip="https://bottom.ch/ksr/2m/data/2m.zip" style="max-height:18lh;"> 
-<code python>+<script type="text/x-starter"> 
 +def summarize_canton(canton): 
 +    """Beschreibt einen Kanton mit Bevölkerung, Fläche, grösster und kleinster Gemeinde.""" 
 +</script> 
 +<script type="text/x-solution">
 def summarize_canton(canton): def summarize_canton(canton):
     with open('gemeinden.csv', 'r') as infile:     with open('gemeinden.csv', 'r') as infile:
Zeile 211: Zeile 317:
 summarize_canton('TI') summarize_canton('TI')
 summarize_canton('GL') summarize_canton('GL')
-</code> +</script> 
-++++ +</bottom-exercise> 
-</nodisp>+
  
 ### Nächstes Kapitel ### Nächstes Kapitel
  
 Weiter mit [[gf_informatik:daten:processing:dictionaries]]. Weiter mit [[gf_informatik:daten:processing:dictionaries]].
  • gf_informatik/daten/processing.1685111254.txt.gz
  • Zuletzt geändert: 2023-05-26 14:27
  • von hof