Vorlesung 4

Werbung
% Vorlesung 4: Input/ Output und Filehandling % Matthias Bieg
Programmieren in Python
Interaktiver Modus
●
Code wird Zeile für Zeile programmiert und direkt ausgeführt
●
Vorteil: Das Verhalten von Codefragmenten kann direkt eingesehen werden
●
Nachteil: Längere Berechnungsvorschriften, die häufig wiederholt werden sind für den
interaktiven Modus zu aufwendig.
Beispiel
#python
>>> l = [2,1,3,4]
>>> l_quadrat = []
>>> for element in l:
>>>
l_quadrat += [element*element]
>>> l_quadrat
[4, 1, 9, 16]
Skripte
●
Der auszuführende Code wird in eine Rein-Text Datei geschrieben
●
Hierzu wird ein Texteditor verwendet (kate, Vi, gedit, ...)
●
Die Textdatei wird gespeichert (üblicherweise mit der Endung .py) und in der Kommandozeile
ausgeführt
Schema
#program.py
Anweisung1
Anweisungskopf1:
Anweisung2
Anweisungskopf2:
Anweisung3
Anweisung4
#Kommandozeile
python program.py
Skripte
●
Anweisungen sind Befehle, die von python ausgeführt werden (z.B. Zuweisung von Variablen,
Operationen, etc.) und können aus einem Anweisungskopf und einem Anweisungskörper
bestehen
●
Anweisungsköpfe sind Kontrollstrukturen (Konditionale, Schleifen, etc) und enden mit einem
Doppelpunkt
●
Der zugehörige Anweisungskörper muss einen Tab weiter eingerückt sein, als der
Anweisungskopf
Beispiel
#invertiereListenElemente.py
liste = [2.,1.,3.,4.] # Anweisung1
inverse_liste = [] # Anweisung2
for element in liste: # Anweisungskopf1
if(not(element == 0)): # Anweisungskopf2
inverse_liste += [1./element] # Anweisung3
else: # Anweisungskopf3
inverse_liste += [None] # Anweisung4
inverse_liste # Anweisung5
Parametrisierung von Skripten
Intro
●
Skripte können mit Hilfe von Argumenten parametrisiert werden
●
Parametrisierung macht den Code wiederverwertbar für das Lösen ähnlicher Probleme
●
Argumente werden durch Leerzeichen getrennt an den Aufruf des Skriptes gehängt
Schema
python program.py <Argument1> <Argument2> ... <Argumentn>
Das Modul: sys
●
Das Modul sys stellt Informationen über den Python Interpreter zur Verfügung (mehr zu Modulen
in Vorlesung 9)
●
Unter anderem kann über das sys Modul auf Argumente des ausgeführten Pythonskriptes
zugegriffen werden
●
sys.argv stellt eine Liste aller Argumente zur Verfügung, wobei das erste Element der Name des
Skripts selbst ist. Die restlichen Elemente der Liste enthalten alle Argumente in der Reihenfolge, in
der sie auf der Kommandozeile angegeben wurden
Das Modul sys
Schema
import sys # Importiere das Modul sys
input1 = sys.argv[1]
input2 = sys.argv[2]
.
.
.
inputn = sys.argv[3]
●
Zuerst wird über die Anweisung import sys das Modul sys geladen
●
Danach werden verschiedene Parameter aus sys.argv den Variablen input1 bis inputn
zugewiesen
●
Beachte: sys.argv[0] ist reserviert für den Namen des auszuführenden Skriptes
Das Modul sys
Beispiel
# quadriere.py
import sys
zahl = int(sys.argv[1])
zahl_quadrat = zahl*zahl
print(str(zahl_quadrat))
python quadriere.py 5
25
INPUT von stdin und OUTPUT nach stdout
STDIN
input([prompt])
●
Die Built-in Funktion input([prompt]) liest Eingabe vom Benutzer und gibt diese als String zurück
●
Parameter prompt ist optional. Hier kann einString angegeben werden, der vor der
Eingabeaufforderung auf der Kommandozeile ausgegeben wird
Beispiel
>>> s = input("Geben Sie einen Text ein: ")
Geben Sie einen Text ein: Python ist gut!
>>> s
Python ist gut!
STDOUT
print([*objects], {sep, end, file})
●
Die Built-in Funktion print schreibt die String-Repräsentationen der durch objects übergebenen
Instanzen in den Datenstrom file
●
SEP: Trennzeichen, das zwischen den auszugebenden Objekten stehen soll [Standardwert: ""]
●
END: Zeichen, welches nach dem letzten auszugebenden Objekt ausgegeben werden soll
[Standardwert: ""]
●
FILE: Datenstrom Objekt in das geschrieben werden soll [Standardwert: sys.stdout]
Beispiel
# zahlenRaten.py
# Importiere das Modul sys
import sys
# Weise der Variablen max_versuche das erste Argument zu
max_versuche = int(sys.argv[1])
geheimzahl=3124
versuch = 0
# Anweisungskopf1
for zaehler in range(max_versuche):
# Fordere interaktiv eine Eingabe des Benutzers an
versuch = int(input("Raten Sie: "))
# Anweisungskopf2
if(versuch < geheimzahl):
# Gebe etwas auf der Standardausgabe aus
print("zu klein", end="\n")
# Anweisungskopf3
elif(versuch > geheimzahl):
# Gebe etwas auf der Standardausgabe aus
print("zu gross", end="\n")
# Anweisungskopf3
else:
# Gebe etwas auf der Standardausgabe aus
print("Super, Sie haben es in", str(zaehler), "Versuchen geschafft!", sep="
", end="\n")
exit() # Verlasse Programm
# Gebe etwas auf der Standardausgabe aus
print("Schade,", str(max_versuche), "waren nicht genug!", sep=" ", end="\n")
Dateiobjekte
Intro
●
Das Lesen und Schreiben von Dateien ist ein zentrales Konzept im Programmieralltag
●
In Python werden Dateiobjekte zum Lesen und schreiben von Daten verwendet
●
Dateiobjekte werden mit der built-in Funktion open erstellt
●
Mit der built-in Funktion close werden Dateiobjekte wieder geschlossen
Dateiobjekte
open(filename, [mode, buffering])
●
Mit der built-in Funktion lassen sich Dateiobjekte erstellen
●
FILENAME ist der absolute oder relative Pfad zur Datei die gelesen, bzw. geschrieben werden soll
●
MODE ist ein optionaler Parameter, der den Zugriffsmodus auf das Dateiobjekt beschreibt (z.B.
nur lesen, nur schreiben, ...)
●
BUFFERING ist ein optionaler Parameter, der angibt wie der Inhalt des Dateiobjektes gepuffert
werden soll
Dateiobjekte
open - Zugriffsmodi
Modus
Beschreibung
"r"
Datei wird ausschliesslich zum Lesen geöffnet
"w"
Datei wird ausschliesslich zum Schreiben geöffnet. Eine evtl. schon bestehende Datei wird
überschrieben
"a"
Datei wird ausschliesslich zum Schreiben geöffnet. Eine evtl. schon bestehende Datei wird
erweitert
"x"
Datei wird ausschliesslich zum Schreiben geöffnet, sofern sie nich existiert. Wenn eine
Datei gleichen Namesn schon existiert, wird eine FileExistsError Exception geworfen
Dateiobjekte
Wichtige Methoden
Methode
Beschreibung
read([size])
Liest size Bytes der Datei ein. Sollte size nicht angegeben sein, wird die
gesamte Datei eingelesen.
readline([size])
Liest eine Zeile der Datei ein. Durch Angabe von size lässt sich die Anzahl der
zu lesenden Bytes begrenzen.
Liest alle Zeilen einer Datei ein und gibt sie in Form einer Liste von Strings
readlines([sizehint]) zurück. Sollte sizehint angegeben sein, wird nur gelesen, bis sizehint Bytes
gelesen wurden.
Dateiobjekte
Wichtige Methoden
Methode
next()
Beschreibung
Liest die nächste Zeile aus der Datei ein und gibt sie als String zurück
seek(offset, [whence]) Setzt die aktuelle Schreib-/ Leseposition in der Datei auf offset
Methode
Beschreibung
tell()
Liefert die aktuelle Schreib-/ Leseposition in der Datei
Dateiobjekte
Wichtige Methoden
Methode
write(str)
Beschreibung
Schreibt den String str in die Datei
writelines(iterable) Schreibt alle Strings aus iterable in die Datei, getrennt durch newline
close()
Schliesst ein bestehendes Dateiobjekt
Dateiobjekte
Lesen
●
Dateiobjekte sind iterierbar, d.h. man kann innerhalb einer for-Schleife Zeile für Zeile einlesen
und bearbeiten
beispiel.fasta
>DNA
ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT
ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA
>>> fasta_file = open("beispiel.fasta", "r")
>>> for line in fasta_file:
>>>
print(line, end="")
>>> fasta_file.close()
>DNA
ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT
ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA
●
Vorsicht: Jeder String einer Zeile endet mit dem Sonderzeichen "\n", das einen Zeienumbruch
symbolisiert. Deshalb setzen wir end auf einen leeren String, um bei der Ausgabe Leerzeilen zu
vermeiden.
Dateiobjekte
Lesen - Ein Ziel viele Wege
beispiel.fasta
>DNA
ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT
ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA
>>> fasta_file = open("beispiel.fasta", "r")
>>> line = fasta_file.readline()
>>> while line:
>>>
print(line, end="")
>>>
line = fasta_file.readline()
>>> fasta_file.close()
>DNA
ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT
ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA
>>> fasta_file = open("beispiel.fasta", "r")
>>> lines = fasta_file.readlines()
>>> for line in lines:
>>>
print(line, end="")
>>> fasta_file.close()
>DNA
ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT
ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA
Dateiobjekte
Schreiben
●
Um Dateien zu schreiben, muss ein Dateiobjekt mit dem Zugriffsmodus "w" geöffnet werden
●
Strings werden mit Hilfe der Methode file.write(string), oder file.writelines(list) in ein Dateiobject
file geschrieben
Dateiobjekte
Schreiben
Beispiel (dbSNP.vcf)
#CHROM POS
1
5364155
1
5370969
1
5372666
ID REF ALT
rs9439517
T
rs12737164 T
rs187515332 C
C,G
A,C,G
T
# extendVcfFile.py
import sys
dbsnp_filename = sys.argv[1]
output_filename = sys.argv[2]
dbSNP_file = open(dbsnp_filename, "r")
output_file = open(output_filename, "w")
for line in dbSNP_file:
split_line = line.rstrip().split("\t")
if(split_line[0] == "#CHROM"):
output_file.write(line)
alternative_bases = split_line[4].split(",")
for alternative_base in alternative_bases:
output_file.write("\t".join(split_line[:4]+[alternative_base])+"\n"))
dbSNP_file.close()
output_file.close()
Exkurs
Spezial, oder Kontroll Zeichen
●
Spezialzeichen sind solche, die nicht ausgegeben werden wie sie erscheinen, da sie eine spezielle
Funktion erfüllen
●
Sie zeichnen sich üblicherweise dadurch aus, dass sie einen backslash vorangestellt haben
Spezial, oder Kontroll Zeichen
Zeichen
Beschreibung
\0
Null Zeichen
\a
Klingel
\b
Backspace (Löschen)
\t
Horizontaler Tab
\n
Newline
\v
Vertikaler Tab
\f
Form Feed (Springe zu nächster Seite)
\r
Carriage return
Spezial, oder Kontroll Zeichen
Zeichen
Beschreibung
\e
Escape
\"
Doppelte Anführungszeichen
\'
Einfache Anführungszeichen
\\
Backslash
Beispiel (newline Zeichen \n)
>>> f = open("beispiel.fasta", "r")
>>> lines = f.readlines()
>>> lines[:2]
['>DNA\n', 'ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT\n']
●
Jede Zeile endet mit einem "newline" Zeichen (\n)
String- und Listen- Methoden
●
In der Bioinformatik ist man sehr oft mit dem Bearbeiten von Tabellen konfrontiert.
●
Diese sind zumeist in Reintextdateien gespeichert
●
Die Spalten sind meist durch ein Tab ("\t") getrennt (der Spaltentrenner kann jedoch jedes
beliebige Zeichen sein)
●
Um Zeilen nach bestimmten Zeichen zu trennen und später wieder zusammenzufügen gibt es
besondere String- bzw. Listen- Methoden
Wichtige Stringmethoden
Methode
Beschreibung
Trennt einen String string nach einem bestimmten Trennzeichten str und gibt
string.split(str="") eine Liste von Unterstrings zurück (nämlich genau diese, welche zwischen den
Trennzeichen standen)
string.rstrip()
Entfernt alle Leerzeichen (" "), Tabs ("\t") und Zeilenumbrüche ("\n") von dem
Ende eines Strings string
string.join(list)
Verbindet eine Liste von Strings list über ein Trennzeichen string und gibt den
konkatenierten String zurück
Wichtige Stringmethoden
Methode
Beschreibung
string.replace(str1, str2)
Sucht nach allen Vorkommen von str1 in string und ersetzt diese durch
str2
string.upper()
Konvertiert alle Zeichen in string nach Grossbuchstaben
string.lower()
Konvertiert alle Zeichen in *string *nach Kleinbuchstaben
Wichtige Stringmethoden
Beispiel (dbSNP.vcf)
#CHROM
1
1
POS ID REF ALT
5357622 rs183636659
5357644 rs143466159
G
C
A
T
# printPolymorphisms.py
import sys
dbSNP_filename = sys.argv[1]
dbSNP_file = open(dbSNP_filename, "r")
for line in dbSNP_file:
split_line = line.rstrip().split("\t")
if(not(split_line[0] == "#CHROM")):
print("->".join(split_line[3:4]), sep="->")
dbSNP_file.close()
python printPolymorphisms.py DBSNP.VCF
G->A
C->T
Anhang
Weiterführende Information
●
Python Standard Bibliothek
Herunterladen