Vorlesung_4

Werbung
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)
Zugehörige Unterlagen
Herunterladen