% 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