Python_Grundlagen¶
ehemalige Veranstaltungen ia3.netz + ia3.data sowie ia4.Netz im Studiengang Interaktive Medien
(c) 2020/2021 Hochschule Augsburg - Fakultät für Informatik - Prof.Dr.Nik Klever
Python Grundlagen¶
Grundlegendes zu Rechnern¶
Ordner¶
Ordnerstruktur¶
Root-Verzeichnis¶
- In Linux und Mac ist das Root-Verzeichnis durch den Schrägstrich '/' gekennzeichnet.
- In Windows ist das Root-Verzeichnis in der Regel der Lokale Datenträger (C:\)
Home-Verzeichnis¶
Das Home-Verzeichnis ist in der Regel das Haupt-Verzeichnis des Benutzers, der gerade eingeloggt ist.
- In Linux ist dies in der Regel /home/<user>/,
- auf dem Mac ist dies in der Regel /Users/<user>/,
- in Windows-Systemen ist es unterschiedlich, abhängig von der Windows Version (seit Windows Vista: C:\Users\<user>\)
Desktop¶
Der Desktop ist in der Regel sowohl unter Linux als auch Mac und Windows ein eigenes Verzeichnis unterhalb des Home-Verzeichnisses
Aktueller Ordner und Eltern-Ordner¶
- Der aktuelle Ordner wird mit . (einem Punkt),
- der Eltern-Ordner mit .. (zwei Punkten) gekennzeichnet.
Versteckte Dateien und Ordner¶
Versteckte Dateien und Ordner (bzw. Hidden Files or Folder) werden in der Regel von Dateimanagern nicht angezeigt. Trotzdem sind diese Dateien und Ordner vorhanden und können auch angesprochen und verwendet werden. Versteckte Dateien und Ordner sind in der Regel mit einem vorangestellten Punkt gekennzeichnet.
Hinweis:
- Windows: Explorer -> Ansicht -> Optionen -> Ordner- und Suchoptionen ändern -> Ansicht -> Versteckte Dateien und Ordner
- Mac: <CMD> <SHIFT> .
Ändern im Terminal s. Beitrag MacWorld - Linux: Nautilus -> Bearbeiten -> Einstellungen -> Ansicht
Programme und Prozesse¶
Programm¶
Was ist ein Programm ? In der Regel eine ausführbare Datei die über das Betriebssystem gestartet werden kann und dann als Prozess auf dem Computer abläuft.
Working Directory¶
Jedes Programm startet als Prozess in einem Ordner. Dieser Ordner ist abhängig vom Programmstart (Klick über Icon, Eingabe über Shell), von Umgebungsvariablen, von Programm selbst, etc. und wird in der Regel Working Directory (bzw. auf deutsch Arbeitsordner) genannt.
Prozess-ID¶
- Jeder Prozess hat während seiner gesamten Laufzeit eine eindeutige ID, die Prozess-ID (pid).
- Diese Prozess-ID kann über den Taskmanager bzw. die Systemüberwachung erkannt werden
- und somit der gesamte Prozess überwacht bzw. auch beendet werden.
Chance im Team¶
- In welchem Ordner wird ihr Jupyter Notebook Server ausgeführt ?
- Und welche Prozess-ID hat er ?
- Speichern sie den jeweiligen Wert in einer Variablen ab
- Geben sie sowohl den Wert als auch den Typ der Variablen aus
Hinweis: Print-Befehl bzw. Print-Funktion¶
Mit dem Print-Befehl bzw. der Print-Funktion kann in Python jederzeit der Inhalt von Variablen und Objekten ausgegeben werden. Dies eignet sich somit als primäre und schnelle Art bei der Fehlersuche in einem Python-Code.
import os
x=os.getcwd()
print(x)
print(type(x))
y=os.getpid()
print(y)
print(type(y))
/home/nik/Desktop/Semesterplanung/2016_WS/ia3datanetz/Skript/WS2016 <type 'str'> 11637 <type 'int'>
Dateien¶
Es gibt sicherlich einige Tausend Dateiformate mit unterschiedlichen Endungen, aber es gibt nur zwei Arten von Dateien.
Chance im Team¶
Zählen sie diese zwei Arten von Dateien auf und erklären sie den wesentlichen Unterschied.
Es gibt die folgenden zwei Arten von Dateien:
- Textdateien
- Binärdateien
Wie der Name schon sagt, können Textdateien in der Regel auch von uns Menschen gelesen werden, Binärdateien hingegen nicht. Natürlich kann es auch Textdateien geben, die nicht gelesen werden können (man denke nur an die Base64-kodierten Anhänge (Bilder, ausführbare Dateien, ...) in E-Mails)
Grundlegendes zu Python¶
Indentation¶
Ein Indentation Error wird geworfen, wenn eine Einrückung erwartet wird jedoch keine vorhanden ist.
if True:
print("Dies ist (k)ein Fehler")
File "<ipython-input-2-b9200107aaa4>", line 2 print("Dies ist (k)ein Fehler") ^ IndentationError: expected an indented block
Dieser Fehler taucht auch häufig auf, wenn in einem Editor Leerzeichen und Tabulatorzeichen vermischt werden!
if True:
print("Hier steht am Anfang der Zeile ein Tabulator-Zeichen")
print("und hier stehen am Anfang der Zeile vier Leerzeichen")
@Desktop:$ python indent_test.py
File "indent_test.py", line 6
print("und hier stehen am Anfang der Zeile vier Leerzeichen")
^
IndentationError: unindent does not match any outer indentation level
Python Hilfe¶
help¶
help()
Welcome to Python 2.7! This is the online help utility.
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/2.7/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics". Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".
help> quit
You are now leaving help and returning to the Python interpreter.
If you want to ask for help on a particular object directly from the
interpreter, you can type "help(object)". Executing "help('string')"
has the same effect as typing a particular string at the help> prompt.
dir¶
dir()
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__name__', '__package__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_ih', '_ii', '_iii', '_oh', '_sh', 'exit', 'get_ipython', 'os', 'quit', 'x', 'y']
Python-Besonderheiten bei Zeichenketten¶
Indizes¶
Zeichenketten können auch über den Index angesprochen werden (subscript), wobei das erste Zeichen den Index 0 besitzt.
wort = 'Python'
print(wort[0]) # erstes Zeichen
print(wort[5]) # Zeichen an der Position 5
P n
Indizes können auch negativ sein und beginnen damit die Nummerierung von rechts:
print(wort[-1]) # letztes Zeichen
print(wort[-2]) # vorletztes Zeichen
print(wort[-6]) # Zeichen an der Position 6 von rechts
n o P
Beachte: Da -0 das Gleiche wie 0 ist, beginnen negative Indizes bei -1.
Slicing¶
Während die Indizierung dazu verwendet wird, um einzelne Zeichen einer Zeichenkette anzusprechen, wird Slicing hergenommen, um Teilzeichenketten anzusprechen:
print(wort[0:2]) # Zeichen ab Position 0 (einschliesslich) bis Position 2 (ausschliesslich)
print(wort[2:5]) # Zeichen ab Position 2 (einschliesslich) bis Position 5 (ausschliesslich)
Py tho
Beachte: der Startindex eines Slices ist immer eingeschlossen und der Endindex ist immer ausgeschlossen. Dies bedeutet, dass s[:i] + s[i:] immer identisch mit der Zeichenkette s selbst ist:
print(wort[:2] + wort[2:])
print(wort[:4] + wort[4:])
Python Python
Slice Indizes haben sinnvolle voreingestellte Werte; ein nicht angegebener erster Index wird auf 0 voreingestellt, ein nicht angegebener zweiter Index wird auf den letzten Index der Zeichenkette voreingestellt.
print(wort[:2]) # Zeichen vom Start weg bis Position 2 (ausschliesslich)
print(wort[4:]) # Zeichen ab Position 4 (einschliesslich) bis zum Ende der Zeichenkette
print(wort[-2:]) # Zeichen ab der vorletzten Position (einschliesslich) bis zum Ende der Zeichenkette
Py on on
Eine Möglichkeit, sich die Indexposition von Slices zu merken ist, Indizes als Marker zwischen den Zeichen zu interpretieren wobei die linke Ecke des ersten Zeichens 0 bezeichnet und die rechte Ecke des letzten Zeichens die Anzahl der Zeichen der Zeichenkette bezeichnet:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
Text und Strings (Zeichenketten)¶
Text bzw. Strings sind Objekte der String-Klasse von Python. Diese String-Klasse ist eine Unterklasse der Sequence-Type-Klasse mit einigen zusätzlichen Eigenschaften, insbesondere den String-Methoden.
Von diesen Methoden werden neben dem Plus-Operator '+' (add) die folgenden immer wieder benötigt:
- find(subtext)
- replace(subtext,newtext)
- split(char)
- join(liste)
Die Funktion str liefert eine schöne (druckbare) Version eines Objekts zurück, während die Funktion repr eine wiederverarbeitbare Version zurückliefert.
Ein- und Ausgabe von Textdateien¶
Dateien schreiben¶
text = """Dies ist ein
über mehrere
Zeilen
gehender
Text,
d.h. ein
mehrzeiliger
Text"""
datei = open("meineDatei","w")
datei.write(text)
datei.close()
print(text)
Dies ist ein über mehrere Zeilen gehender Text, d.h. ein mehrzeiliger Text
Dateien lesen¶
datei = open("meineDatei","r")
gesamterText = datei.read()
datei.close()
print(gesamterText)
Dies ist ein über mehrere Zeilen gehender Text, d.h. ein mehrzeiliger Text
Fehlermeldungen¶
datei = open("irgendein.Dateiname.den.es.nicht.gibt","r")
--------------------------------------------------------------------------- IOError Traceback (most recent call last) <ipython-input-12-f10fc4852b59> in <module>() ----> 1 datei = open("irgendein.Dateiname.den.es.nicht.gibt","r") IOError: [Errno 2] No such file or directory: 'irgendein.Dateiname.den.es.nicht.gibt'
x = 1/0
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-13-9a769fda9620> in <module>() ----> 1 x = 1/0 ZeroDivisionError: integer division or modulo by zero
prinnt(x)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-14-b9306a514c2d> in <module>() ----> 1 prinnt(x) NameError: name 'prinnt' is not defined
x = range(10)
print(x)
print(x[0])
print(x[9])
x[10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 9
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-15-70e7bcd73f2e> in <module>() 3 print(x[0]) 4 print(x[9]) ----> 5 x[10] IndexError: list index out of range
Aktives Plenum¶
Verändern sie den Code
datei = open("meineDatei","r")
gesamterText = datei.read()
datei.close()
so, dass
- die obigen 3 Zeilen in eine Funktion leseDatei(dateiname) eingebaut wird und
- als Rückgabewert die gesamte eingelesene Datei zurückgegeben wird und zusätzlich
- ein eventueller IOError abgefangen wird und dabei
- eine entsprechende Fehlermeldung (einschl. dem Dateinamen) ausgegeben wird sowie
- None als Rückgabewert zurückgegeben wird
def leseDatei(dateiname):
try:
datei = open(dateiname,"r")
gesamterText = datei.read()
datei.close()
return gesamterText
except IOError:
print("Die Datei {} wurde nicht gefunden".format(dateiname))
return None
rs = leseDatei("meineDatei")
if rs: print(rs)
Dies ist ein über mehrere Zeilen gehender Text, d.h. ein mehrzeiliger Text
Hilfsmittel zum Finden von Dateien¶
Methode glob¶
Die Bibliothek glob - Unix style pathname pattern expansion enthält die beiden Methoden glob und iglob um sehr effektiv und einfach Filenamen zu finden.
Im folgenden Beispiel werden alle Dateien (ausgenommen die versteckten Dateien) des aktuellen Arbeitsverzeichnisses in einer Liste zusammengestellt:
import glob
x=glob.glob('*')
for f in x:
print(f)
XML_Einfuehrung_und_Grundlagen.ipynb Einführung und Organisatorisches.ipynb meineDatei Python_Grundlagen.ipynb
Chance im Team¶
Lesen sie nun eine HTML Datei mit der Lösung der Aufgabe aus dem aktiven Plenum ein.
import os
print(os.getcwd())
x=glob.glob('../*.html')
print(x)
if len(x)>0: rs = leseDatei(x[0])
else: rs = "Keine HTML Datei vorhanden"
print(rs)
print(repr(rs))
/home/nik/Desktop/Semesterplanung/2016_WS/ia3datanetz/Skript/WS2016
['../PTFBestellformular.html', '../browserResult.html']
<html>
<head>
<title>PTF Bestellformular</title>
</head>
<body>
<h1>PTF Bestellformular</h1>
<form ACTION="/formular" method="GET">
<h3>Kunde</h3>
<p>Name <input name="Kunde" size="46"/></p>
<p>Strasse <input name="Strasse" size="40"/></p>
<p>Ort <input name="Ort" size="20"> Plz <input name="Plz" size="4"></p>
<h3>Kreditkarte</h3>
<p>Mastercard <input name="Kreditkarte" type="radio" value="Mastercard"/>
Visacard <input name="Kreditkarte" type="radio" value="Visacard"/></p>
<p>Nummer <input name="Kreditkartennummer" size="10"/>
Ablaufdatum <input name="Ablaufdatum" size="4"/></p>
<h3>PTF Bestellgröße</h3>
<p>Groß <input name="Groesse" type="radio" value="gross"/>
Mittel <input name="Groesse" type="radio" value="mittel"/>
Klein <input name="Groesse" type="radio" value="klein"/></p>
<h3>Zustellung</h3>
<p>Expresszustellung <input name="Express" type="checkbox"/></p>
<p><input type="submit" value="Bestellung abschicken"/></p>
</form>
<p>Vielen Dank für ihre Bestellung!</p>
</body>
</html>
'<html>\n<head>\n <title>PTF Bestellformular</title>\n</head>\n<body>\n <h1>PTF Bestellformular</h1>\n <form ACTION="/formular" method="GET">\n <h3>Kunde</h3>\n <p>Name <input name="Kunde" size="46"/></p>\n <p>Strasse <input name="Strasse" size="40"/></p>\n <p>Ort <input name="Ort" size="20"> Plz <input name="Plz" size="4"></p>\n <h3>Kreditkarte</h3> \n <p>Mastercard <input name="Kreditkarte" type="radio" value="Mastercard"/>\n Visacard <input name="Kreditkarte" type="radio" value="Visacard"/></p>\n <p>Nummer <input name="Kreditkartennummer" size="10"/>\n Ablaufdatum <input name="Ablaufdatum" size="4"/></p>\n <h3>PTF Bestellgröße</h3>\n <p>Groß <input name="Groesse" type="radio" value="gross"/>\n Mittel <input name="Groesse" type="radio" value="mittel"/>\n Klein <input name="Groesse" type="radio" value="klein"/></p>\n <h3>Zustellung</h3>\n <p>Expresszustellung <input name="Express" type="checkbox"/></p>\n <p><input type="submit" value="Bestellung abschicken"/></p>\n </form>\n <p>Vielen Dank für ihre Bestellung!</p>\n</body>\n</html>'