ZMBP

Wissenschaftlich Arbeiten mit Computer und Internet

Uni Tuebingen

Kursübersicht

English

Bioinformatik


Python

Tag 1
1. Einführung
2. Strings
3. Dateien

Tag 2
4. Listen,Schleifen
5. Funktionen

Tag 3
6. Verzweigung
7. Reg.Exp.

Tag 4
8. Dictionaries
9. System/Input

Tag 5 (Expert)
OOP
Webinterface
GUI
NumPy
Pandas
Data Visualisation

Index


Impressum

Bioinformatik

Tag 4
Python - System, Input, formatierte Ausgabe

Nach einer Idee und mit Beispielen von Dr. Martin Jones -
http://pythonforbiologists.com/index.php/introduction-to-python-for-biologists/


Vorträge als jupyter Notebook
Übungsaufgaben pdf
Daten für die Übungen (zip-Datei)



Card puncher - NARA - 513295 -
Unknown or not provided, Card puncher - NARA - 513295,
verändert von Steinmetz, CC0 1.0



Mit Python können Dateien in einem Betriebssystem (Windows, Linux, MacOSX) kopiert, verschoben, umbenannt oder gelöscht werden.

Es muss berücksichtigt werden, dass Pythonprogramme auf den unterschiedlichen Computer-Betriebssystemen laufen sollen.
Windows, Linux und Apple MacOS.

Diese Betriebssysteme zeigen eine unterschiedliche Ordner- und Dateiverwaltung.

Python stellt dafür die entsprechenden Module bereit.
Es sind hauptsächlich OS ("Operating System") und shutil ("SHell UTILities").





NASA, IBM Electronic Data Processing Machine - GPN-2000-001881,
verändert von Steinmetz, CC0 1.0



Dateien und Ordner verwalten

Dateien umbenennen - os.rename()

Eine bestehende Datei soll umbenannt werden.

#Datei umbenennen

import os

os.rename("old.txt", "new.txt")

Zuerst muss das Modul os mit import os aufgerufen werden.
Jetzt steht die Funktion os.rename() aus dem Modul os zum Umbenennen der Datei zur Verfügung.
os.rename("old.txt", "new.txt")
Die Funktion os.rename() nimmt 2 Argumente auf.
Der erste ist der alte Dateiname und der zweite ist der neue Dateiname.

Hinweise:
Das Beispiel geht davon aus, dass sich sowohl das Python Programm,
als auch die Datei zum Umbenennen in dem gleichen Ordner befinden.
Wenn nicht, muss der entsprechende Pfadname beim Aufruf von rename() angegeben werden.
Der Pfad unterscheidet sich bei Windows, Linux oder Mac Betriebssystemen.

Außerdem müssen auch die Zugriffrechte zum Ändern der Datei bestehen.




Datei bewegen - os.rename()

Wird in der Funktion os.rename() als 2. Argument ein anderer Ordner angegeben,
wird die Datei in den 2. Ordner bewegt.

#Datei bewegen, Windows

import os

os.rename("test1\\old.txt", "test2\\old.txt")

Die Datei old.txt wird aus dem Ordner test1 in den Ordner test2 bewegt.
In dem Ordner test1 ist keine Datei old.txt mehr vorhanden.

Bemerkung
Hier wird ein relativer Pfad benutzt.
In dem Programmordner, liegen 2 Ordner test1 und test2.

os.rename("test1\\old.txt", "test2\\new.txt")
Die Datei wird gleichzeitig bewegt und umbenannt.

2 Backslash (\\) weil eines als Escape-Zeichen verwendet wird.
Alternativ würde auch raw-String r gehen
os.rename(r"test1\old.txt", r"test2\new.txt")

Windows 10 verkraftet inwischen auch einen einfachen Schrägstrich!
os.rename("test1/old.txt", "test2/old.txt")


Ordner umbenennen

Mit os.rename() kann auch ein Ordner umbenannt werden.

#Ordner umbenennen, Windows

import os

os.
rename("ordner_alt", "ordner_neu")

Der Ordner wird umbenannt. Der Ordner muss nicht leer sein.

Beispiel alle Dateien in einem Ordner umbenennen. Statt Dateiendung '.JPG' die Endung '.jpg' verwenden.:
import os
[os.rename(f, f.replace('.JPG', '.jpg')) for f in os.listdir('.') if not f.startswith('.')]
Es wird list-comprehension verwendet.



Einen neue Ordner erstellen - os.mkdir()

Die Funktion os.mkdir() erstellt einen neuen Ordner

#Ordner erstellen, Windows

import os

os.mkdir("ordner1")

Mit
os.mkdir("ordner1")
wird ein neuer Ordner ordner1 angelegt.




Mehrere neue Ordner erstellen - os.makedirs()

Es können mehrere Ordner mit os.makedirs() erstellt werden (Windowsversion).

#mehrere Ordner erstellen, Windows

import os

os.makedirs("ordner1\\ordner2\\ordner3")

Es wird ein Ordner ordner1 im gleichen Verzeichnis erstellt.
In dem ordner1 wird gleichzeitig ein ordner2 erstellt.
Und in dem ordner2 ein ordner3.




Datei oder Ordner kopieren - shutil.copy

Die Funktion shutil.copy() aus dem Modul shutil kann eine Datei oder einen Ordner kopieren.

#Datei kopieren, Windows

import os, shutil

shutil.copy("original.txt", "kopie.txt")

Die Methode shutil.copy() kopiert die Datei original.txt nach kopie.txt

Hinweis:
Es gibt noch eine weitere Funktion shutil.copytree(), die auch
Dateien und Ordner in einem ganzen Baum kopiert.




Prüfen, ob Datei existiert - os.path.exists()

Um Fehler beim Programmablauf zu vermeiden, ist es wichtig, vorher zu testen, ob eine Datei mit diesem Pfad überhaupt existiert.
Das kann eine Funktion aus dem Modul os,
os.path.exists().

#Datei kopieren, Windows

import os

if os.path.exists("original.txt"):
    
print("Datei ist vorhanden")


Hinweis:
Es kann auch geprüft werden, ob bereits ein Ordner im aktuellen Verzeichnis ist.
Dazu folgenden Befehl verwenden:
os.path.isdir("Ordnername")



Dateien und Ordner löschen - os.remove, os.rmdir, shutil.rmtree

Um eine Datei oder einen leeren Ordner zu löschen wird os.remove verwendet.

#Datei loeschen, Windows

import os

os.remove("test.txt")

Es kann mit os.rmdir("Ordner1") auch ein Ordner gelöscht werden.
Allerdings muss auch hier der Ordner leer sein.

Ordner mit Inhalt werden mit shutil.rmtree("Ordner1") samt Inhalt gelöscht.

Hinweis:
Achtung bei Windows, Probleme mit Zugriffsrechte. Datei darf nicht geöffnet sein.


Dateien und Ordnern auflisten - os.listdir und os.walk

Die Funktion os.listdir gibt eine Liste der Dateien und Ordner aus.
Argumente für diese Funktion ist der Pfad bis zu diesem Ordner.
Der aktuelle Ordner wird mit "." angegeben.

#Liste der Dateien und Ordner ausgeben, Windows

import os

for datei_name in os.listdir("."):
    
print(datei_name)

Ist der Ordner in einem anderen Pfad, muss der entsprechende Pfad angegeben werden.



Werden Informationen über die Unterordner gesucht, kann os.walk() verwendet werden.
Die Funktion geht durch den ganzen Verzeichnisbaum, ab angegebenen Pfad und gibt ein abfragbares Objekt aus.
Es kann folgendes abgefragt werden:
- Pfad und Verzeichnisname als String
- Liste der Verzeichnisse
- Liste der Dateinamen imVerzeichnis.

Hier ein anschauliches Beispiel (Quelle)

#Liste mit Dateigröße der Dateien und Ordner
# in allen Unterverzeichnissen, Windows

import os
from os.path import join, getsize

for dirpaths, dirs, files in os.walk("."):
    
print(dirpaths, ":", end=" ")
    
print(sum(getsize(join(dirpaths, name)) for name in files), end=" ")
    
print("bytes in", len(files), "non-directory files")

Das kleine Programm berechnet die Dateigröße in Byte und Anzahl für alle Dateien in den Unterverzeichnissen.




Arbeitsverzeichnis - Current Working Directory

Das aktuelle Arbeitsverzeichnis lässt sich leicht mit os.getcwd() ermitteln.
Die Methode os.chdir('c:\\NeuerOrdner1\\NeuerOrdner2') wechselt das aktuelle Arbeitsverzeichnis.
Natürlich muss es diese Ordner geben, sonst wird eine Fehlermeldung ausgegeben.

Mit os.path.join('Ordner1','Ordner2','Ordner3') kann der spezifische Pfad je nach Betriebssystem erstellt werden.
Es wird unter Windows der Pfad 'Ordner1\Ordner2\Ordner3' erstellt. Unter Linux und Mac lautet der Pfad 'Ordner1/Ordner2/Ordner3'.

Mit diesen Funktionen kann ein Programm unabhängig vom Betriebssystem organisiert werden.



born1945, IBM 403 Accounting Machine,
verändert von Steinmetz, CC BY-SA 2.0





Programme aufrufen - subprocess.call

Wenn das Programm in selben Ordner wie die Programmdatei liegt, kann das Programm einfach mit
subprocess.call() aufgerufen werden. Dazu ist das Modul subprocess nötig.
Entsprechend dem Betriebssystem den Pfad angeben, wenn das Programm nicht im selben Ordner liegt.

#Programm aufrufen, Windows calculator

import subprocess

subprocess.call("calc.exe")

Hinweis:
Das Beispiel klappt, da die Anwendung in c:\windows\system32 liegt.
Von diesem Ordner liegt eine Umgebungsvariable im Windows Systempfad vor,
diese Anwendungen können daher in jedem Ordner aufgerufen werden.
Es ist daher keine Pfadangabe nötig.



Programmausgabe speichern - subprocess.check_output

Manchmal möchte man die Ausgabe externer Programme in einer Variablen speichern.
Dazu hilft die Funktion subprocess.check_output().

#Programm aufrufen, Windows ipconfig.exe

import subprocess

get_ipconfig = subprocess.check_output("ipconfig.exe")

print(get_ipconfig)

Hinweis:
Die Ausgabe geht oft über mehrere Zeilen, daher eventuell mit rstrip() nextline \n entfernen.









Benutzereingabe

Bis jetzt konnten wir Daten nur über Variablen oder Dateien in das Programm eingeben.

Manchmal ist es sinnvoll während des Programmablaufs Daten eingeben zu können.



Interactiv - input()

Die einfachste Möglichkeit etwas einzugeben, stellt die Funktion input() dar.

#Eingabe, input()

gen_number = input("Bitte 'Gen-Nummer' eingeben... ")

print("Sie haben die Nummer ", gen_number, " eingegeben.")

Die Funktion hält das Programm an und wartet auf eine Eingabe des Benutzers.

Die Eingabe wird mit einem Enter abgeschlossen.

In Python 2 wird die Eingabe evaluiert und der Dateityp festgestellt.
Das kann leicht zu Fehlern führen! Mit raw_string() wird immer der Dateityp String festgelegt.
In Python3 dagegen ist die Eingabe immer String.


Tipps:
Benutzereingaben mit input() am Anfang der Programme einbauen.

Überprüfung des Inputs durchführen ("Input validation").



Werte in der Komandozeilen beim Start des Programms eingeben - sys.argv

Eine gute Strategie ist es, wenn beim Start des Programms Werte mit eingegeben werden können
("Command line arguments").

Beim Start eines Python Programms in der Eingabeaufforderung (Terminal) können Argumente mitgegeben werden.
Dies kann durch sys.argv aus dem Modul sys erreicht werden.

#Argumente in der Eingabeaufforderung

import sys

print(sys.argv)

In der Eingabeaufforderung wird folgendes eingetippt:

python myprogram.py eins zwei drei

Das Programm oben gibt folgende Liste aus:

['myprogram.py', 'eins', 'zwei', 'drei']

Das erste Element der Liste ist immer der Programmname.

Dann folgen die Argumente, die beim Aufruf des Programms übergeben wurden.

Die Liste kann so ausgegeben werden:

print('Dateiname: ',sys.argv[0])
print('Erstes Argument: ',sys.argv[1])
print('Zweites Argument: ',sys.argv[2])

Die Argumente werden als Zeichenketten gespeichert, daher bei Bedarf
mit int() oder float() in andere Datentypen umwandeln.



Module für die Auswertung der Argumente

argpars - Das Modul gibt in der Eingabeaufforderung Hilfestellungen zu den Argumenten ("user-friendly command-line interfaces")

click - "Command Line Interface Creation Kit"

docopt - "Pythonic command line arguments parser, that will make you smile"

curses - Etwas anderes als die oben vorgestellten Programme.
Das Modul gehört zu den Standardmodulen von Python. Es sorgt für eine ansprechende Ausgabe. Tabellen und Fenster.



Zwischenablage - pyperclip

Getestet mit Python 3.90 - 14.9.22

pypi.org/project/pyperclip/

Für kleine Programme ist es eine gute Idee, wenn man aus der Zwischenablage Daten holen könnte
und in die Zwischenablage kopieren könnte.

Das kann das Modul pyperclip.

Mit pyperclip.paste() wird aus der Zwischenablage kopiert und mit pyperclip.copy() in die Zwischenablage kopiert.

Hier ein kleines Beispiel (Verändert nach Al Sweigart "Automate the boring stuff with python", no starch press, 2015).

#Aus und in die Zwischenablage

import pyperclip

text=pyperclip.paste()

lines = text.split('\n')
for i in range(len(lines)):
    lines[i]='> '+lines[i]
text='\n'.
join(lines)
pyperclip.
copy(text)

Das Programm funktioniert so:

Den Code oben in die Datei pyperclip.py kopieren

In Word oder anderes Textbearbeitungsprogramm einen Text mit mehreren Absätzen in die Zwischenablage kopieren (Strg + C).
Das Programm starten (python pyperclip.py)
Die Zwischenablage in einen Text kopieren (Strg + V)
Nun ist vor jedem Absatz ein > Zeichen eingefügt.




Formatierte Ausgabe

In dieser Einführung soll die Formatierung der Ausgabe vorgestellt werden.
Es gibt eine ganz alte, eine neue und eine ganz neue Schreibweise.
Einen Vergleich von Joanna Jablonski gibt es hier:
realpython.com/python-f-strings/

Zur verdeutlichung wird ein einfaches Beispiel gewählt.

%-formatting

Das %-formating ist die älteste Methode und sollte nicht mehr angewendet werden.
Ist aber noch weit verbreitet und soll daher hier vorgestellt werden.

Eine ausführlichere Beschreibung findet sich unter
python-kurs.eu/python3_formatierte_ausgabe.php

#Formatierte Ausgabe

print("Gennummer: %5d, Expressionrate: %10.2f" % (123, 29.2689))
print(
"Gennummer: %5d, Expressionrate: %10.2f" % (4, 0.1023))
print(
"Gennummer: %5d, Expressionrate: %10.2f" % (12678, 1234.12))

In der print() Funktion sind die Ausgabe mit Formatierungsbefehlen versehen.
"Gennummer: %5d, Expressionrate: %10.2f" ist die Formatierung
(123, 29.2689) ist der Tupel mit Werten, beide Teile werden mit % getrennt.

In der Formatierung befinden sich 2 Platzhalter, die durch ein % gekennzeichnet werden.

%5d ist der Platzhalter für den ersten Wert im Tupel (123).
5 bedeutet, dass insgesamt 5 Stellen vorgesehen werden.
d ist das Zeichen für Integer, i würde auch gehen.

%10.2f ist der zweite Platzhalter für den zweiten Wert im Tupel (29.2689).
10.2 bedeutet insgesamt 10 Stellen und 2 Dezimalstellen,
f steht für ein floating-Zahltyp.

Es wird folgendes ausgegeben:

Gennummer: 123, Expressionrate: 29.27

Die ganze Schönheit der Formatierung erschließt sich nur, wenn wie hier weitere Zeilen ausgegeben werden.   

Gennummer:  123, Expressionrate:  29.27
Gennummer:  4, Expressionrate:  0.10
Gennummer: 12678, Expressionrate:    1234.12



Methode .format()

Eine neuere Weise die Ausgabe zu formatieren ist mit der Methode .format().

#Formatierte Ausgabe mit Methode format()

print("Gennummer: {a:5d}, Expressionrate:{p:10.2f}".format (a=123, p=29.2689))
print(
"Gennummer: {a:5d}, Expressionrate:{p:10.2f}".format (a=4, p=0.1029))
print(
"Gennummer: {a:5d}, Expressionrate:{p:10.2f}".format (a=12678, p=1234.12))

Ausgegeben wird wieder wie oben:Gennummer: 123, Expressionrate: 29.27

Gennummer:  123, Expressionrate:  29.27
Gennummer:  4, Expressionrate:  0.10
Gennummer: 12678, Expressionrate:    1234.12




F-String ("Literal String Interpolation")

Seit Python Version 3.6 gibt es eine dritte Möglichkeit eine formatierte Ausgabe zu erstellen.
PEP 498- Literal String Interpolation

Vor dem String wird ein kleines f oder großes F gestellt.
f"Gennummer: {a:5d}, Expressionrate:{p:10.2f}"

Ein gutes Tutorial fidet sich auf zetcode.com
zetcode.com/python/fstring/

#Formatierte Ausgabe mit Methode f-string()

a , p = 123 , 29.2689
print(f"Gennummer: {a:5d}, Expressionrate:{p:10.2f}")
a , p = 4 , 0.1029
print(f"Gennummer: {a:5d}, Expressionrate:{p:10.2f}")
a , p = 12678 , 1234.12
print(f"Gennummer: {a:5d}, Expressionrate:{p:10.2f}")

Die Ausgabe ist wieder exakt wie bei den Beispielen oben.

Gennummer:  123, Expressionrate:  29.27
Gennummer:  4, Expressionrate:  0.10
Gennummer: 12678, Expressionrate:    1234.12

Die Variablen stehen hier außerhalb des Strings.
Platzhalter ist die geschweifte Klammer { }.

Formate werden nach dem Doppelpunkt angegeben.
{p:10.2f}

{Variable : Stellenangabe .Genauigkeit}

5 bedeutet, dass insgesamt 5 Stellen vorgesehen werden.
d ist das Zeichen für Integer (digit), i würde auch gehen.

10.2 bedeutet insgesamt 10 Stellen und 2 Dezimalstellen,
f steht für ein floating-Zahltyp.




Grafik ausgeben

Für die Ausgabe einer Grafik wird die Programmbibliothek matplotlib verwendet.
Zusätzlich ist die Erweiterung NumPy sinnvoll.
matplotlip, NumPy und SciPy werden als PyLab zusammengefasst und stellen eine Alternative zu dem kostenpflichtigen Programm Matlab dar.

Auf matplotlib baut die Grafikbibliothek seaborn auf. seaborn wurde für statistische Analysen entwickelt.

Ausführliches Tutorial Data Visualization dieser Kurs

Die meisten Pakete für Grafikausgaben sind in der Distribution Anaconda enthalten.
Erforderliche Module lassen sich leicht nachinstallieren.



Eine gute Einführung in das Thema gibt es auf matplotlib.org
matplotlib.org/users/pyplot_tutorial.html
Diese Anleitung als ipython notebook
pyplot-tutorial.ipynb
(Aktuelles ipython ist notwendig)

matplotlib gallery - viele Beispiele
matplotlib.org/gallery.html

seaborn gallery
seaborn.pydata.org/examples/index.html
seaborn Tutorial

Mit Hilfe des Moduls pandas können auch Diagramme erstellt werden.
Einführung dazu gibt es unter
pandas.pydata.org/pandas-docs/stable/visualization.html

PyLab
jakevdp.github.io/mpl_tutorial/tutorial_pages/tut1.html



Hier ein einfaches Beispiel mit matplotlib, wie ein Liniendiagramm erstellt wird.
#Einfaches Liniendiagramm mit matplotlib

import matplotlib.pyplot as plt

plt.plot([1,2,3,4], [1,4,9,16])
plt.ylabel('
some numbers')
plt.xlabel('
x-value')
plt.show()





Ein etwas aufwändigeres Beispiel mit seaborn.
Es zeigt mit ein paar Befehlen kann ein ansprechender Boxplot gemacht werden.

#Boxplot mit seaborn
#https://seaborn.pydata.org/examples/grouped_boxplot.html

import seaborn as sns
# style:darkgrid, whitegrid, dark, white, ticks
# palette: Standardfarben
# https://seaborn.pydata.org/tutorial/color_palettes.html
sns.set(style="ticks", palette="pastel")

# Beispieldaten aus dem seaborn Modul
tips = sns.load_dataset("tips")
print(tips)

# boxplot Rechnung "total_bill" gegen Wochentag "day"
# Raucher "smoker", m=magenta g=gruen

sns.boxplot(x="day", y="total_bill",
hue="
smoker", palette=["m", "g"],
data=tips)
# x- und y-Achsen werden getrimmt
sns.despine(offset=10, trim=True)






Zum Abschluss noch ein Notebook Beispiel mit seaborn.
Aus einer umfangreichen Tabelle mit Genalignments 'gen_heatmap.csv' soll eine 'Heatmap' erstellt werden

#Heatmap mit seaborn

%matplotlib inline

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

sns.set()

# index_col: First column is Index of row,
# default is first row index of column
gen_al=pd.read_csv('gen_heatmap.csv',delimiter=';',index_col=0)
# Fill NaN with 0
gen_al=gen_al.
fillna(0)

# table complete
# Figure size Din A4
a4_dims = (11.7, 8.27)


fig, ax = plt.subplots(figsize=a4_dims)
sns.
heatmap(gen_al)

#Slice of the Table, only part of the table Gen1 to Gen20
gen_part=gen_al.
loc['Gen1':'Gen20','Gen1':'Gen20']

sns.heatmap(gen_part, annot=True, linewidths=.5, ax=ax,
vmin=50, vmax=100)




Beispiel Seaborn Heatmap jupyter



Hinweise:
In jupyter notebook ist noch ein
%matplotlib inline
am Anfang des Codes notwendig.

Mit
fig=sns_plot.get_figure()
fig.savefig('fig.png',dpi=300)

kann in eine Datei gespeichert werden.



More Examples

Tutorial. Verschiedene Beispiele (IPython Notebook)
(Quelle http://matplotlib.org/users/pyplot_tutorial.html )

Venn-Diagramm aus Exceldatei erstellen.
Paket matplotlib-venn notwendig (IPython Notebook)

Heatmap Basketballtabelle (IPython Notebook)
Quelle
Heatmap gene repeats.
Genesequenzen Alignments (IPython Notebook)




Dieter Steinmetz, Universität Tübingen, ZMBP - Kursübersicht - Im Skript suchen