Skip to content
Snippets Groups Projects
Commit 9093b5dd authored by Christof Kaufmann's avatar Christof Kaufmann
Browse files

Notebooks from ckaufmann/akis-python-framework@7af5a267

parent a17b48b7
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id:0003-26d3840a841b908d490849c2314fe3d08456fce2d17a974110551f1821f tags:
%% Cell type:markdown id:0003-f116af43be7e3bf3e28b7867b22097f04bc086ae53df174d257b79605a5 tags:
# Inputs
Schreibe Python-Code, der den Benutzer nach seinem Namen fragt und den
eingegebenen Namen mit der `input`-Funktion in einer Variablen `name`
Schreibe Python-Code, der den Benutzer mit `input('Name:\n')` nach
seinem Namen fragt und den eingegebenen Namen in einer Variablen `name`
speichert. Gib dann eine personalisierte Begrüßung im Format
`Hallo {name}!` aus.
## Lösung
Mithilfe von `input()` können Benutzereingaben eingelesen werden und mit
`input('Text>')` wird dabei ein `'Text>'` ausgegeben. Wir wollen nach
dem Namen fragen:
%% Cell type:code id:0004-7ab8e896beec2ab09a5468a32fc317201111cd5ce6794192f2dbc6f99c9 tags:
%% Cell type:code id:0004-5dd4d60f5101c812b0fca1492d4af328ffa67a0e461f776494afcc007b5 tags:
```
name = input('Name: ')
name = input('Name:\n')
```
%% Output
Name:
%% Cell type:markdown id:0005-fda8d82a8e50741c09f7fd83f368957657f7aa30bd4d1d97b6bfdd76d9c tags:
Wenn beispielsweise “Dennis” eingegeben wird, ergibt folgender Code die
folgende Ausgabe:
%% Cell type:code id:0006-da95f092f0054be78fcba3b3d581adfff7c5cf1c7982cb6e8a3760009a7 tags:
```
print("Hallo {}!".format(name))
```
%% Output
Hallo Dennis!
......
%% Cell type:markdown id:0002-0cb3d5cc71278c7a1521fbd6bb1173d6c70998de509a171e595c878c60e tags:
%% Cell type:markdown id:0002-ee6e0225942ce79daf49a8682114af41cc6963024b0875dfcb18fe85d6a tags:
# Inputs
Schreibe Python-Code, der den Benutzer nach seinem Namen fragt und den
eingegebenen Namen mit der `input`-Funktion in einer Variablen `name`
Schreibe Python-Code, der den Benutzer mit `input('Name:\n')` nach
seinem Namen fragt und den eingegebenen Namen in einer Variablen `name`
speichert. Gib dann eine personalisierte Begrüßung im Format
`Hallo {name}!` aus.
Hier Ihr Code:
%% Cell type:code id:0003-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
......
%% Cell type:markdown id:0006-c8ac03a9af14ca08bde09cb72be37cfc96415cbdd61d3844e6f2332d53b tags:
# Temperaturumrechner
Schreibe zwei Funktionen um Temperaturen zwischen Celsius und Fahrenheit
umzurechnen:
- Die Funktion `celsius_to_fahrenheit` erhält eine Temperatur in °C
und gibt eine Temperatur in °F zurück. Die Formel dazu ist
$\frac 9 5 \cdot temp_C + 32$.
- Die Funktion `fahrenheit_to_celsius` erhält eine Temperatur in °F
und gibt eine Temperatur in °C zurück. Die Formel dazu ist
$(temp_F - 32) \cdot \frac 5 9$.
Erstellen Sie Code, der den Benutzer nach einer Temperatur und der
Einheit fragt und dann in die andere Einheit umrechnet.
*Hinweis: Erstellen Sie verschiedene Arten von Kommentaren. Ein Teil ist
hier schon vorbereitet, um den Abschnitt der Funktionen abzugrenzen und
die Funktion mit einem sogenannten
[docstring](https://pandas.pydata.org/docs/development/contributing_docstring.html)
zu dokumentieren. Führen Sie die Code-Dokumentation in dem Stil fort und
ergänzen Sie bei Bedarf auch normale Kommentare.*
## Lösung
Der Temperaturumrechner benötigt zwei Funktionen:
%% Cell type:code id:0007-a248507b61a93b7c8a44db922cb79894c4c1820b0a9d6933d1bfbddb49f tags:
```
# %% Funktionen
def celsius_to_fahrenheit(celsius):
'''
Convert a temperature from °C to °F.
Parameters
----------
celsius : float
temperature in °C
Returns
-------
float
The temperature in °F.
'''
fahrenheit = celsius * 9/5 + 32
return fahrenheit
def fahrenheit_to_celsius(fahrenheit):
'''
Convert a temperature from °F to °C.
Parameters
----------
fahrenheit : float
temperature in °F
Returns
-------
float
The temperature in °C.
'''
celsius = (fahrenheit - 32) * 5/9
return celsius
```
%% Cell type:markdown id:0008-08ae3e6be2e258dfd71d4b97805dbb1f47d065d9e0bb621fcce073200fe tags:
Der Skript-Teil mit den Eingaben, könnte z. B. so aussehen:
%% Cell type:code id:0009-f8c9622c539cfc56449f4ee7113cbf2fa0a959b2c03c92f94a0624d32ab tags:
```
# %% Dialog-Skript
print("Willkommen beim Temperaturumrechner!")
# Einlesen der Temperatur und der Einheit mithilfe von input
temperature = float(input("Gib die Temperatur ein: "))
unit = input("Gib die Einheit der Temperatur ein C für Celsius und F für Fahrenheit: ")
# Umrechnung zu anderer Einheit und Ausgabe
if unit.upper() == "C":
fahrenheit = celsius_to_fahrenheit(temperature)
print(f"Die Temperatur von {temperature}°C entspricht {fahrenheit}°F.")
elif unit.upper() == "F":
celsius = fahrenheit_to_celsius(temperature)
print(f"Die Temperatur von {temperature}°F entspricht {celsius}°C.")
else:
print("Ungültige Einheit. Versuche es erneut.")
```
%% Cell type:markdown id:0012-fbd98a848e74262943642ff91967825267ed331a62ea817561649132079 tags:
Hierbei haben wir zwei Abschnitte mit `# %% Abschnittstitel` erstellt.
Die Umrechnungsfunktionen sind mit docstrings dokumentiert und zudem ist
Programmablauf kommentiert.
## Tests
Hier einfache Tests, um zu überprüfen, ob die Aufgabe richtig gelöst
wurde. Testen des Umrechnens von 0°C und 32°F
%% Cell type:code id:0013-2e62da8d8ff0f3965f49f78de337973afd4b1b102ff718bbdc415364b9c tags:
```
c = fahrenheit_to_celsius(32)
print("32°F entsprechen {}°C.".format(c))
```
%% Output
32°F entsprechen 0.0°C.
%% Cell type:code id:0014-0d71766660ccbf72397c171d831ff3fe6c70dd5fa47f2ea0749ad623a4d tags:
```
f = celsius_to_fahrenheit(0)
print("0°C entsprechen {}°F.".format(f))
```
%% Output
0°C entsprechen 32.0°F.
%% Cell type:code id:0015-ffd0cc435853f6ee7cb5afb438a35be3abd767c279d42598ea18d338636 tags:
```
help(celsius_to_fahrenheit)
```
%% Output
Help on function celsius_to_fahrenheit in module temperaturumrechner:
<BLANKLINE>
celsius_to_fahrenheit(celsius)
Convert a temperature from °C to °F.
<BLANKLINE>
Parameters
----------
celsius : float
temperature in °C
<BLANKLINE>
Returns
-------
float
The temperature in °F.
<BLANKLINE>
......
%% Cell type:markdown id:0004-cd2df25e973867879a4bb574548536cad74524ad1f7450fcdc6b7ff317a tags:
# Temperaturumrechner
Schreibe zwei Funktionen um Temperaturen zwischen Celsius und Fahrenheit
umzurechnen:
- Die Funktion `celsius_to_fahrenheit` erhält eine Temperatur in °C
und gibt eine Temperatur in °F zurück. Die Formel dazu ist
$\frac 9 5 \cdot temp_C + 32$.
- Die Funktion `fahrenheit_to_celsius` erhält eine Temperatur in °F
und gibt eine Temperatur in °C zurück. Die Formel dazu ist
$(temp_F - 32) \cdot \frac 5 9$.
Erstellen Sie Code, der den Benutzer nach einer Temperatur und der
Einheit fragt und dann in die andere Einheit umrechnet.
*Hinweis: Erstellen Sie verschiedene Arten von Kommentaren. Ein Teil ist
hier schon vorbereitet, um den Abschnitt der Funktionen abzugrenzen und
die Funktion mit einem sogenannten
[docstring](https://pandas.pydata.org/docs/development/contributing_docstring.html)
zu dokumentieren. Führen Sie die Code-Dokumentation in dem Stil fort und
ergänzen Sie bei Bedarf auch normale Kommentare.*
%% Cell type:code id:0005-45dfe59ad3a014e00e5b64fabfaed06936d456d66f3794f103d1e33e37e tags:
```
# %% Funktionen
def celsius_to_fahrenheit(celsius):
'''
Convert a temperature from °C to °F.
Parameters
----------
celsius : float
temperature in °C
Returns
-------
float
The temperature in °F.
'''
fahrenheit =
```
%% Cell type:markdown id:0007-b311e0a7580d37251223da7d9acd90b49c42533dd27f2a09bfe2664ecd7 tags:
## Tests
Hier einfache Tests, um zu überprüfen, ob die Aufgabe richtig gelöst
wurde. Testen des Umrechnens von 0°C und 32°F
%% Cell type:code id:0008-2e62da8d8ff0f3965f49f78de337973afd4b1b102ff718bbdc415364b9c tags:
```
c = fahrenheit_to_celsius(32)
print("32°F entsprechen {}°C.".format(c))
```
%% Output
32°F entsprechen 0.0°C.
%% Cell type:code id:0009-0d71766660ccbf72397c171d831ff3fe6c70dd5fa47f2ea0749ad623a4d tags:
```
f = celsius_to_fahrenheit(0)
print("0°C entsprechen {}°F.".format(f))
```
%% Output
0°C entsprechen 32.0°F.
%% Cell type:code id:0010-ffd0cc435853f6ee7cb5afb438a35be3abd767c279d42598ea18d338636 tags:
```
help(celsius_to_fahrenheit)
```
%% Output
Help on function celsius_to_fahrenheit in module temperaturumrechner:
<BLANKLINE>
celsius_to_fahrenheit(celsius)
Convert a temperature from °C to °F.
<BLANKLINE>
Parameters
----------
celsius : float
temperature in °C
<BLANKLINE>
Returns
-------
float
The temperature in °F.
<BLANKLINE>
......
%% Cell type:markdown id:0003-85ed6e56446a332d5efae36e9fd2cfef380cc0934b5739d7ec516205bbf tags:
%% Cell type:markdown id:0004-172491ad86495bfb1112dc3e46dcfde3f7d4fd83054973755d5944d1554 tags:
# Vorname und Nachname
Für ein automatisches Anschreiben sollen aus einem String der Vorname
und Nachname zusammengefügt werden. Schreiben Sie eine Funktion die aus
einem String mit dem Muster “Nachname, Vorname” die Form “Vorname
Nachname” zurückgibt. Schreiben Sie eine zweite Funktion, die eine Liste
von solchen Namen erhält und eine List mit den Namen in der
und Nachname zusammengefügt werden. Schreiben Sie eine Funktion
`arrange_name`, die aus einem String mit dem Muster “Nachname, Vorname”
einen String der Form “Vorname Nachname” erstellt und zurückgibt.
Schreiben Sie eine zweite Funktion `arrange_all_names`, die eine Liste
von solchen Namen erhält und eine Liste mit den Namen in der
umgewandelten Form zurück gibt. Falls ein Name nicht in die andere Form
gebracht werden kann, soll der Name einfach wie er ist in die Liste.
Behandeln Sie diesen Fall mit einer `try`-`except`-Anweisung.
gebracht werden kann, soll der Name in der usprünglichen Form in die
Liste aufgenommen werden. Behandeln Sie diesen Fall mit einer
`try`-`except`-Anweisung.
## Lösung
In der Funktion, in der der Name umgewandelt wird, gibt es keine
Fehlerbehandlung:
Die Funktion `arrange_name` teilt den Namensstring `sur_pre` bei dem
Komma auf. Falls der String jedoch kein Komma enthält, wie z. B. in
`'Martin Bob'`, gibt Split eine Liste mit einem Element zurück, z. B.
`['Martin Bob']`. In einem solchen Fall löst die Zuweisung an zwei
Variablen (Unpacking) einen `ValueError` aus (“not enough values to
unpack (expected 2, got 1)”). In der Funktion `arrange_name`, gibt es
aber keine Fehlerbehandlung, sondern der Fehler wird später in
`arrange_all_names` gefangen.
%% Cell type:code id:0004-356af918808472e0f0cb2b6b8f868033d70483767a3785cf5f85e71d2b9 tags:
%% Cell type:code id:0005-356af918808472e0f0cb2b6b8f868033d70483767a3785cf5f85e71d2b9 tags:
```
def arrange_name(sur_pre: str):
sur, pre = sur_pre.split(',')
return f'{pre.strip()} {sur.strip()}'
```
%% Cell type:markdown id:0005-8a86d76dce81086fdfb257d157c694ce880c5bd1c1e3f94283e16f9f3e7 tags:
%% Cell type:markdown id:0006-d5815205b0558435821b8bed93a279497aa4a014b5d1436af79c6c10335 tags:
Die Fehlerbehandlung passiert hier für jedes Element separat:
Die Fehlerbehandlung passiert hier für jedes Element separat, d. h.
innerhalb der Schleife:
%% Cell type:code id:0006-a965d7669d538c0bfdf3175d70fb12c7209d7cc54857a808429772e1626 tags:
%% Cell type:code id:0007-c2d5ba9e41433f5dead013e4315b7911b26ae3f632b76f9d337b2f3da75 tags:
```
def arrange_all_names(names: list[str]):
arranged_names = []
for n in names:
for name in names:
try:
arranged_names.append(arrange_name(n))
arranged_names.append(arrange_name(name))
except ValueError as e:
arranged_names.append(n)
arranged_names.append(name)
return arranged_names
```
%% Cell type:markdown id:0008-272cd9aa81868ceb995439ba8bf165fe8938e3cd124fd6d15ca1efdbf52 tags:
%% Cell type:markdown id:0009-272cd9aa81868ceb995439ba8bf165fe8938e3cd124fd6d15ca1efdbf52 tags:
## Tests
Um die Lösung zu testen folgen verschiedene Tests. Zuerst ein Test mit
den Strings, wie sie erwartet werden:
%% Cell type:code id:0009-afaf0dedbfc036602e0edb5cb5e7dde85c170fa5894d07364e335bb7c69 tags:
%% Cell type:code id:0010-afaf0dedbfc036602e0edb5cb5e7dde85c170fa5894d07364e335bb7c69 tags:
```
arrange_all_names(["Wake, Alice", "Martin, Bob"])
```
%% Output
['Alice Wake', 'Bob Martin']
%% Cell type:markdown id:0010-8dec3ea5111294b05cf05621ec8b41a2227410743bab63b8906c529c5ae tags:
%% Cell type:markdown id:0011-8761e8b19b014b6d41d785e8e07319420b34d34660878bb7b92cf3a1b21 tags:
Nun ein Fall, bei dem es nicht so funktioneren sollte, wie zuvor.
Nun ein Fall, bei dem ein Name kein Komma enthält:
%% Cell type:code id:0011-fb5f0a5fb4232a02fb148b07d6559d2487cb2a58f0ea39bc9b0c0faa55a tags:
%% Cell type:code id:0012-fb5f0a5fb4232a02fb148b07d6559d2487cb2a58f0ea39bc9b0c0faa55a tags:
```
arrange_all_names(["Wake, Alice", "Martin Bob"])
```
%% Output
['Alice Wake', 'Martin Bob']
......
%% Cell type:markdown id:0002-51eb76a5d9d3c28244fddc7cf0f57f103ab40ee073eafbdbd442147fb41 tags:
%% Cell type:markdown id:0003-cb106dcbdec9820f67c96b18eb00b1971eb80ebfc839bccc0b9a7a15e96 tags:
# Vorname und Nachname
Für ein automatisches Anschreiben sollen aus einem String der Vorname
und Nachname zusammengefügt werden. Schreiben Sie eine Funktion die aus
einem String mit dem Muster “Nachname, Vorname” die Form “Vorname
Nachname” zurückgibt. Schreiben Sie eine zweite Funktion, die eine Liste
von solchen Namen erhält und eine List mit den Namen in der
und Nachname zusammengefügt werden. Schreiben Sie eine Funktion
`arrange_name`, die aus einem String mit dem Muster “Nachname, Vorname”
einen String der Form “Vorname Nachname” erstellt und zurückgibt.
Schreiben Sie eine zweite Funktion `arrange_all_names`, die eine Liste
von solchen Namen erhält und eine Liste mit den Namen in der
umgewandelten Form zurück gibt. Falls ein Name nicht in die andere Form
gebracht werden kann, soll der Name einfach wie er ist in die Liste.
Behandeln Sie diesen Fall mit einer `try`-`except`-Anweisung.
gebracht werden kann, soll der Name in der usprünglichen Form in die
Liste aufgenommen werden. Behandeln Sie diesen Fall mit einer
`try`-`except`-Anweisung.
Hier Ihr Code:
%% Cell type:code id:0003-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
%% Cell type:code id:0004-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
%% Cell type:markdown id:0005-272cd9aa81868ceb995439ba8bf165fe8938e3cd124fd6d15ca1efdbf52 tags:
%% Cell type:markdown id:0006-272cd9aa81868ceb995439ba8bf165fe8938e3cd124fd6d15ca1efdbf52 tags:
## Tests
Um die Lösung zu testen folgen verschiedene Tests. Zuerst ein Test mit
den Strings, wie sie erwartet werden:
%% Cell type:code id:0006-afaf0dedbfc036602e0edb5cb5e7dde85c170fa5894d07364e335bb7c69 tags:
%% Cell type:code id:0007-afaf0dedbfc036602e0edb5cb5e7dde85c170fa5894d07364e335bb7c69 tags:
```
arrange_all_names(["Wake, Alice", "Martin, Bob"])
```
%% Output
['Alice Wake', 'Bob Martin']
%% Cell type:markdown id:0007-8dec3ea5111294b05cf05621ec8b41a2227410743bab63b8906c529c5ae tags:
%% Cell type:markdown id:0008-8761e8b19b014b6d41d785e8e07319420b34d34660878bb7b92cf3a1b21 tags:
Nun ein Fall, bei dem es nicht so funktioneren sollte, wie zuvor.
Nun ein Fall, bei dem ein Name kein Komma enthält:
%% Cell type:code id:0008-fb5f0a5fb4232a02fb148b07d6559d2487cb2a58f0ea39bc9b0c0faa55a tags:
%% Cell type:code id:0009-fb5f0a5fb4232a02fb148b07d6559d2487cb2a58f0ea39bc9b0c0faa55a tags:
```
arrange_all_names(["Wake, Alice", "Martin Bob"])
```
%% Output
['Alice Wake', 'Martin Bob']
......
......@@ -78,7 +78,9 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"metadata": {
"stdin": "john@example.com"
},
"outputs": [
{
"output_type": "stream",
......@@ -124,7 +126,9 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"metadata": {
"stdin": "john\n,@\n\n"
},
"outputs": [
{
"output_type": "stream",
......
......@@ -53,7 +53,9 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"metadata": {
"stdin": "john@example.com"
},
"outputs": [
{
"output_type": "stream",
......@@ -99,7 +101,9 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"metadata": {
"stdin": "john\n,@\n\n"
},
"outputs": [
{
"output_type": "stream",
......
%% Cell type:markdown id:0004-1a22c81f89a69deb8e0b154f809c5dd704d9734869fe5add33334c8098a tags:
# ietaD
Entwickeln Sie eine Funktion `reverse_file`, die den Inhalt einer Datei
liest und überschreibt mit dem selben Inhalt, aber rückwärts. Also wenn
in der Datei “bla bla” steht, stünde danach “alb alb” in der Datei.
Allerdings sollen folgende Fehler behandelt werden:
- Falls die Datei nicht existiert, soll
`"Datei {path} nicht gefunden. Lege mit Inhalt '42' an."` ausgegeben
werden und so behandelt werden, als hätte in der Datei der Inhalt
“24” gestanden.
- Falls die Datei nicht überschrieben werden kann, soll
`"Datei {path} nicht überschreibbar. Schreibe in {new_path}."`
ausgegeben werden. Dabei soll `new_path` vor der Dateiendung den
Zusatz `"-reversed"` erhalten und entsprechend der Meldung
geschrieben werden.
## Lösung
Die Funktion `reverse_file` fängt nur die Fehler ab, die es auch
behandelt. Das ist wichtig, weil sonst unerwartete Fehler zu
unerwartetem Verhalten (Bugs) führen könnte. Aus gleichem Grund enthält
der `try`-Block auch nur den Code, der die Fehler auslösen kann.
%% Cell type:code id:0005-c25785b5b0c408402bd3470509256590ad6a9bd06ecd6f4f7846f0cb8ae tags:
```
import os
import pathlib
def reverse_file(path):
try:
with open(path, 'r') as file:
content = file.read()
except FileNotFoundError:
print(f"Datei {path} nicht gefunden. Lege mit Inhalt '42' an.")
content = '24'
try:
with open(path, 'w') as file:
file.write(content[::-1])
except PermissionError:
base, ext = os.path.splitext(path)
new_path = base + '-reversed' + ext
print(f"Datei {path} nicht überschreibbar. Schreibe in {new_path}.")
with open(new_path, 'w') as file:
file.write(content[::-1])
```
%% Cell type:markdown id:0007-73c3d048fb33f8efafb6ea955124d21ce60be4350a735c09fd7cbbd9aa6 tags:
## Tests
Zunächst testen wir den erfolgreichen Lese- und Schreibfall:
%% Cell type:code id:0008-3e1d1dff31993309ff575b504cc1366908624d6bae2aa49fc40e4852d06 tags:
%% Cell type:code id:0008-c9f31c28f7b84a956df22a5ca50a8d5ac5b957b025d2a348a8b1ade80a1 tags:
```
reverse_file("invariant.txt")
reverse_file('invariant.txt')
```
%% Cell type:markdown id:0009-4aa3df99972306ae500b2bf3a0a1617ee8079578bdc9a6b4a2a18c14caa tags:
%% Cell type:markdown id:0009-9a7dcc38db75e349b62140fcb88647d9a5fc1e0f4964c25391675e99482 tags:
Nun testen wir, ob eine nicht existierende Datei angelegt wird.
Nun testen wir, ob eine nicht existierende Datei vermeintlich angelegt
wird:
%% Cell type:code id:0010-aacb5cd209f7f7b7446164b3c28c9ab791137989faec4b498f8d8de822d tags:
%% Cell type:code id:0010-81f39a1e0c3d041536d28b748e6b0c7cc8cfbcae3875cd5399eec41f7ec tags:
```
reverse_file("nonexistent.txt")
reverse_file('nonexistent.txt')
```
%% Output
Datei nonexistent.txt nicht gefunden. Lege mit Inhalt '42' an.
%% Cell type:markdown id:0011-2b16e1e8fc9199d4cafb3af27dd4e6863d194d6f9f46fd64e5ff04d7848 tags:
%% Cell type:markdown id:0011-6ee5d7669036c0eb0e3a7e6e9d2300c2ee0dff85d6b1f54d0bc57063a8c tags:
Und ob sie existiert und den richtigen Dateiinhalt hat:
%% Cell type:code id:0012-645e47c307eedbad8df27ada0d7a5e16885b56a587cdbbf6a7e9cfebf25 tags:
```
pathlib.Path('nonexistent.txt').read_text()
```
%% Output
'42'
%% Cell type:markdown id:0013-2b16e1e8fc9199d4cafb3af27dd4e6863d194d6f9f46fd64e5ff04d7848 tags:
Und wir setzen die Datei `protected.txt` auf read-only /
schreibgeschützt um den Fall auch zu testen:
%% Cell type:code id:0012-a2895356a9ac4fcf67cab2ab2239b5f4207c761b23d0f25883917ac2f48 tags:
%% Cell type:code id:0014-ebba69735245e224ad3a5b0321110e44db685f99b6b7bb8784cb1581f4a tags:
```
import stat
os.chmod("protected.txt", stat.S_IREAD)
reverse_file("protected.txt")
os.chmod('protected.txt', stat.S_IREAD)
```
%% Cell type:code id:0015-05cf43fc4a0cd5f41a374ec88a9f910dab5815523f5e6562c43d4b7a262 tags:
```
reverse_file('protected.txt')
```
%% Output
Datei protected.txt nicht überschreibbar. Schreibe in protected-reversed.txt.
%% Cell type:code id:0013-d1e431a305c0430153268314c136f0aefc9102f2fc4b854c42498218dfa tags:
%% Cell type:code id:0016-d1e431a305c0430153268314c136f0aefc9102f2fc4b854c42498218dfa tags:
```
pathlib.Path('protected-reversed.txt').read_text()
```
%% Output
'\n987654321\n.stnetnoc elif lausu emoS'
......
%% Cell type:markdown id:0002-4abb38d9adb84b882819d40a004c7e4e042d58319ee130261edae55bfee tags:
# ietaD
Entwickeln Sie eine Funktion `reverse_file`, die den Inhalt einer Datei
liest und überschreibt mit dem selben Inhalt, aber rückwärts. Also wenn
in der Datei “bla bla” steht, stünde danach “alb alb” in der Datei.
Allerdings sollen folgende Fehler behandelt werden:
- Falls die Datei nicht existiert, soll
`"Datei {path} nicht gefunden. Lege mit Inhalt '42' an."` ausgegeben
werden und so behandelt werden, als hätte in der Datei der Inhalt
“24” gestanden.
- Falls die Datei nicht überschrieben werden kann, soll
`"Datei {path} nicht überschreibbar. Schreibe in {new_path}."`
ausgegeben werden. Dabei soll `new_path` vor der Dateiendung den
Zusatz `"-reversed"` erhalten und entsprechend der Meldung
geschrieben werden.
%% Cell type:code id:0003-1dc225fe70f0081c398a653f689b251f6d8fa660526a7d38c5a7e313259 tags:
```
import os
import pathlib
def reverse_file(path):
# Fange Sie hier die verschiedenen Fehler ab
```
%% Cell type:markdown id:0005-73c3d048fb33f8efafb6ea955124d21ce60be4350a735c09fd7cbbd9aa6 tags:
## Tests
Zunächst testen wir den erfolgreichen Lese- und Schreibfall:
%% Cell type:code id:0006-3e1d1dff31993309ff575b504cc1366908624d6bae2aa49fc40e4852d06 tags:
%% Cell type:code id:0006-c9f31c28f7b84a956df22a5ca50a8d5ac5b957b025d2a348a8b1ade80a1 tags:
```
reverse_file("invariant.txt")
reverse_file('invariant.txt')
```
%% Cell type:markdown id:0007-4aa3df99972306ae500b2bf3a0a1617ee8079578bdc9a6b4a2a18c14caa tags:
%% Cell type:markdown id:0007-9a7dcc38db75e349b62140fcb88647d9a5fc1e0f4964c25391675e99482 tags:
Nun testen wir, ob eine nicht existierende Datei angelegt wird.
Nun testen wir, ob eine nicht existierende Datei vermeintlich angelegt
wird:
%% Cell type:code id:0008-aacb5cd209f7f7b7446164b3c28c9ab791137989faec4b498f8d8de822d tags:
%% Cell type:code id:0008-81f39a1e0c3d041536d28b748e6b0c7cc8cfbcae3875cd5399eec41f7ec tags:
```
reverse_file("nonexistent.txt")
reverse_file('nonexistent.txt')
```
%% Output
Datei nonexistent.txt nicht gefunden. Lege mit Inhalt '42' an.
%% Cell type:markdown id:0009-2b16e1e8fc9199d4cafb3af27dd4e6863d194d6f9f46fd64e5ff04d7848 tags:
%% Cell type:markdown id:0009-6ee5d7669036c0eb0e3a7e6e9d2300c2ee0dff85d6b1f54d0bc57063a8c tags:
Und ob sie existiert und den richtigen Dateiinhalt hat:
%% Cell type:code id:0010-645e47c307eedbad8df27ada0d7a5e16885b56a587cdbbf6a7e9cfebf25 tags:
```
pathlib.Path('nonexistent.txt').read_text()
```
%% Output
'42'
%% Cell type:markdown id:0011-2b16e1e8fc9199d4cafb3af27dd4e6863d194d6f9f46fd64e5ff04d7848 tags:
Und wir setzen die Datei `protected.txt` auf read-only /
schreibgeschützt um den Fall auch zu testen:
%% Cell type:code id:0010-a2895356a9ac4fcf67cab2ab2239b5f4207c761b23d0f25883917ac2f48 tags:
%% Cell type:code id:0012-ebba69735245e224ad3a5b0321110e44db685f99b6b7bb8784cb1581f4a tags:
```
import stat
os.chmod("protected.txt", stat.S_IREAD)
reverse_file("protected.txt")
os.chmod('protected.txt', stat.S_IREAD)
```
%% Cell type:code id:0013-05cf43fc4a0cd5f41a374ec88a9f910dab5815523f5e6562c43d4b7a262 tags:
```
reverse_file('protected.txt')
```
%% Output
Datei protected.txt nicht überschreibbar. Schreibe in protected-reversed.txt.
%% Cell type:code id:0011-d1e431a305c0430153268314c136f0aefc9102f2fc4b854c42498218dfa tags:
%% Cell type:code id:0014-d1e431a305c0430153268314c136f0aefc9102f2fc4b854c42498218dfa tags:
```
pathlib.Path('protected-reversed.txt').read_text()
```
%% Output
'\n987654321\n.stnetnoc elif lausu emoS'
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment