Code wird Zeile für Zeile programmiert und direkt ausgeführt Vorteil: Das Verhalten von Codefragmenten kann direkt eingesehen werden Nachteil: Längere Berechnungsvorschri en, die häufig wiederholt werden sind für den interak ven Modus zu aufwendig. In [2]: l = [2, 1, 3, 4] l_quadrat = [] for element in l: l_quadrat += [element * element] print(l_quadrat) [4, 1, 9, 16] 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 In [3]: %pycat program.py Anweisung1 Anweisungskopf1: Anweisung2 Anweisungskopf2: Anweisung3 Anweisung4 In [ ]: %run python program.py Anweisungen sind Befehle, die von python ausgeführt werden (z.B. Zuweisung von Variablen, Opera onen, etc.) und können aus einem Anweisungskopf und einem Anweisungskörper bestehen Anweisungsköpfe sind Kontrollstrukturen (Kondi onale, Schleifen, etc) und enden mit einem Doppelpunkt Der zugehörige Anweisungskörper muss einen Tab weiter eingerückt sein, als der Anweisungskopf In [4]: %pycat 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 print(inverse_liste) # Anweisung5 In [5]: %run invertiereListenElemente.py [0.5, 1.0, 0.3333333333333333, 0.25] 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 stellt Informa onen ü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 Schema import sys # Importiere das Modul sys input1 = sys.argv[1] input2 = sys.argv[2] ... inputn = sys.argv[n] 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 sys In [6]: %pycat quadriere.py import sys zahl = int(sys.argv[1]) zahl_quadrat = zahl*zahl print(str(zahl_quadrat)) In [4]: %run quadriere.py 10 100 Die Built-in Funk on input([prompt]) liest Eingabe vom Benutzer und gibt diese als String zurück Parameter prompt ist op onal. Hier kann ein String angegeben werden, der vor der Eingabeaufforderung auf der Kommandozeile ausgegeben wird In [5]: s = input("Geben Sie einen Text ein: ") print('Sie haben "' + s + '" geschrieben.') Geben Sie einen Text ein: Some input Sie haben "Some input" geschrieben. Die Built-in Funk on print schreibt die String-Repräsenta onen 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: "\n"] FILE: Datenstrom Objekt in das geschrieben werden soll [Standardwert: sys.stdout] In [9]: %pycat 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") sys.exit() # Verlasse Programm # Gebe etwas auf der Standardausgabe aus print("Schade,", str(max_versuche), "waren nicht genug!", sep=" ", end="\n") In [6]: %run zahlenRaten.py 10 Raten Sie: zu klein Raten Sie: zu gross Raten Sie: Super, Sie 1000 5000 3124 haben es in 2 Versuchen geschafft! 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 Funk on open erstellt Mit der built-in Funk on close werden Dateiobjekte wieder geschlossen Mit der built-in Funk on lassen sich Dateiobjekte erstellen *FILENAME* ist der absolute oder rela ve Pfad zur Datei die gelesen, bzw. geschrieben werden soll *MODE* ist ein op onaler Parameter, der den Zugriffsmodus auf das Dateiobjekt beschreibt (z.B. nur lesen, nur schreiben, ...) *BUFFERING* ist ein op onaler Parameter, der angibt wie der Inhalt des Dateiobjektes gepuffert werden soll 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 exis ert. Wenn eine Datei gleichen Namesn schon exis ert, wird eine FileExistsError Excep on geworfen 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. readlines([sizehint]) Liest alle Zeilen einer Datei ein und gibt sie in Form einer Liste von Strings zurück. Sollte sizehint angegeben sein, wird nur gelesen, bis sizehint Bytes gelesen wurden. Methode Beschreibung next() Liest die nächste Zeile aus der Datei ein und gibt sie als String zurück seek(offset, [whence]) Setzt die aktuelle Schreib-/ Leseposi on in der Datei auf offset tell() Liefert die aktuelle Schreib-/ Leseposi on in der Datei Methode Beschreibung write(str) 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 sind iterierbar, d.h. man kann innerhalb einer for-Schleife Zeile für Zeile einlesen und bearbeiten In [11]: %pycat beispiel.fasta >DNA ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA In [12]: 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. In [13]: 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 In [14]: fasta_file = open("beispiel.fasta", "r") lines = fasta_file.readlines() for line in lines: print(line, end="") fasta_file.close() >DNA ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA In [15]: fasta_file = open("beispiel.fasta", "r") print(fasta_file.read()) fasta_file.close() >DNA ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT ACACCGGGTCCGGTGGCGTGGCTCCCGAGGATGACGTATCCGCCGAGGATA 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 In [16]: %pycat dbSNP.vcf #CHROM 1 1 1 In [17]: POS 5364155 5370969 5372666 ID REF rs9439517 rs12737164 rs187515332 ALT T T C C,G A,C,G T %pycat 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) else: 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() In [18]: %run extendVcfFile.py dbSNP.vcf dbSNP.extended.vcf %pycat dbSNP.extended.vcf #CHROM 1 1 1 1 1 1 POS 5364155 5364155 5370969 5370969 5370969 5372666 ID REF rs9439517 rs9439517 rs12737164 rs12737164 rs12737164 rs187515332 ALT T T T T T C C G A C G T Spezialzeichen sind solche, die nicht ausgegeben werden wie sie erscheinen, da sie eine spezielle Funk on erfüllen Sie zeichnen sich üblicherweise dadurch aus, dass sie einen backslash vorangestellt haben Zeichen Beschreibung \0 Null Zeichen \a Klingel \b Backspace (Löschen) \t Horizontaler Tab \n Newline \v Ver kaler Tab \f Form Feed (Springe zu nächster Seite) \r Carriage return Zeichen Beschreibung \e Escape \" Doppelte Anführungszeichen \' Einfache Anführungszeichen \\ Backslash In [19]: f = open("beispiel.fasta", "r") lines = f.readlines() lines[:2] Out[19]: ['>DNA\n', 'ATGGACGAGGACGACAATCCACGAGATGGCAATCGACGGGAAGATGGGGGT\n'] Jede Zeile endet mit einem "newline" Zeichen (\n) In der Bioinforma k ist man sehr o mit dem Bearbeiten von Tabellen konfron ert. 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 bes mmten Zeichen zu trennen und später wieder zusammenzufügen gibt es besondere String- bzw. Listen- Methoden Methode Beschreibung string.split(str="") Trennt einen String string nach einem bes mmten Trennzeichten str und gibt eine Liste von Unterstrings zurück (nämlich genau diese, welche zwischen den Trennzeichen standen) string.rstrip() En ernt 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 Methode Beschreibung string.replace(str1, str2) Sucht nach allen Vorkommen von str1 in string und ersetzt diese durch str2 string.upper() Konver ert alle Zeichen in string nach Grossbuchstaben string.lower() Konver ert alle Zeichen in string nach Kleinbuchstaben In [20]: %pycat 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 split_line[0] != "#CHROM": print('->'.join(split_line[3:5])) dbSNP_file.close() In [21]: %run printPolymorphisms.py dbSNP.extended.vcf T->C T->G T->A T->C T->G C->T Python Standard Bibliothek (h ps://docs.python.org)