Das mit den gehäuften .splits gestehe ich sehr gerne zu, wobei ich davon ausgehe, dass nach einem ersten Testen der Funktion die Zeile 8 ohnehin als erstes gelöscht wird und dann bleibt nur noch die Hälfte übrig.
Das Aufteilen auf verschiedene Listen ist sicher unelegant, wahrscheinlich aber für einen C Programmierer leicht zu handeln. In jedem Fall danke für die Hinweise . Ich bin selbst noch nicht sehr weit im Python Lernen.
PTT Datein einlesen
Python ist aber nun mal kein C. In Python sähe die Funktion eher so aus (ungetestet):
Code: Alles auswählen
def startstop(zellen):
"""Liest den Zellen jeweils das erste Element aus und gibt je eine Liste
der Start- und der Endpunkte jedes Gens zurueck.
"""
starts = list()
stops = list()
for start, stop in (map(int, row[0].split('..')) for row in zellen):
print 'Gen beginnt bei %d und endet bei %d.' % (start, stop)
starts.append(start)
stops.append(stop)
return starts, stops
Hallo zusammen...
erstmal vielen vielen dank für die viele resonanz.
Das Problem was ich habe ist das es ja insgesamt 5 oder 6 Spalten sind.
D.h. die Zellen die ich benutze brauchen 5 oder 6 segmente. Ich hab aber keine Ahnung wie ich diese Zellen definieren soll bzw die zuordnung einer Zeile auf das jeweilige Segment vornehme.
Gruß
erstmal vielen vielen dank für die viele resonanz.
Das Problem was ich habe ist das es ja insgesamt 5 oder 6 Spalten sind.
D.h. die Zellen die ich benutze brauchen 5 oder 6 segmente. Ich hab aber keine Ahnung wie ich diese Zellen definieren soll bzw die zuordnung einer Zeile auf das jeweilige Segment vornehme.
Gruß
Also ich zähle da 9 Spalten!? Was meinst Du mit "Zellen" und "Segmenten"? Versuch besser "Python" mit uns zu sprechen. Da haben wir Listen und die haben Elemente.
Du brauchst doch nur bis zur ersten Datenzeile "überspringen" und kannst dann ganz einfach die Zeilen lesen, an '\t' zerteilen und diese Listen dann in eine Liste stecken. Schon hast Du eine zweidimensionale Datenstruktur.
Wenn Du mit den numerischen Werten etwas anstellen willst, musst Du die noch von Zeichenketten in Zahlen umwandeln und vielleicht aus der ersten Spalte zwei machen, oder Elemente der ersten Spalte in ein Tupel mit Start- und Endwert umwandeln.
Statt einer Liste pro Zeile könnte man vielleicht auch eine Klasse für die Datensätze schreiben.
Du brauchst doch nur bis zur ersten Datenzeile "überspringen" und kannst dann ganz einfach die Zeilen lesen, an '\t' zerteilen und diese Listen dann in eine Liste stecken. Schon hast Du eine zweidimensionale Datenstruktur.
Wenn Du mit den numerischen Werten etwas anstellen willst, musst Du die noch von Zeichenketten in Zahlen umwandeln und vielleicht aus der ersten Spalte zwei machen, oder Elemente der ersten Spalte in ein Tupel mit Start- und Endwert umwandeln.
Statt einer Liste pro Zeile könnte man vielleicht auch eine Klasse für die Datensätze schreiben.
-
- User
- Beiträge: 136
- Registriert: Sonntag 15. Januar 2006, 20:31
- Wohnort: Greifswald
- Kontaktdaten:
BlackJack voll zustimmend, will ich noch mal den Versuch einer Klärung auf einer anderen Ebene, nämlich der Aufgabenstellung aus dem ersten Post machen:
BlackJack hat vorgeschlagen, die Daten in einer Klasse zu hinterlegen.
Soweit wir Dich verstanden haben, sind die Aufgaben gelöst. Ohne eine präzisere und verständlichere Problembeschreibung (nicht: Problemandeutung) wird es also nicht weiter gehen.
Gruß,
Bernhard
Gut. Bist Du sicher?Das Zeilenweise einlesen ist auch nicht das Problem
Geht mit split, wie Dill gezeigt hat. Und wie man die dabei gewonnenen gesplitteten Daten speichert und nicht verliert zeigt mein allererster Code in diesem Thread.das Problem welches ich im Moment habe ist das die einzelnen Spalten der Datei eben auch getrennt werden müssen.
Aus einer Spalte im Originalfile eine Liste machen. Der von mir weniger elegant gepostete und von BlackJack verfeinerte Code macht aus der ersten Spalte zwei Listen: Eine mit dem Anfangsbasenpaar und eine mit dem Ende-Basenpaar. Anhand dieses Beispiels kannst Du doch bestimmt für die verbleibenden acht Spalten selbst den Code schreiben, dass daraus auch jeweils Listen werden.Es müsste also möglich sein z.B. unterschiedliche Listen zu erstellen die die einzelnen Spalten speichern.
...und das ist schon vorbereitet, weil die zitierte Funktion Dir bereits die Locations als Integer zurückgibt.und lese dann aus der liste mit den Locations die zahlen raus
Du kannst alternativ die Daten in der im Code als "zellen" beschriebenen Form behalten und auf jedes Element zugreifen, wie ich es in meinem ersten Post anhand der Liste "a" vorgemacht habe. Kommt darauf an, was Du nachher damit machen willst.müssen keine Listen sein wenn jemand nen besseren Vorschlag hat bin ich sehr dankbar!)
BlackJack hat vorgeschlagen, die Daten in einer Klasse zu hinterlegen.
Soweit wir Dich verstanden haben, sind die Aufgaben gelöst. Ohne eine präzisere und verständlichere Problembeschreibung (nicht: Problemandeutung) wird es also nicht weiter gehen.
Gruß,
Bernhard
Also erstmal...
ja ich bin sicher das ich mit dem einlesen kein Problem haben werde da ich schon Module für FastA und andere Formate geschrieben habe.
ich denke mit euren Tipps und dem abschließenden Post werde ich es wohl irgendwie auf die Reihe bekommen die File vernünftig einzulesen.
Falls nicht werd ich mich hier an dieser Stelle einfach nochmal melden.
Grüße
Phill
ja ich bin sicher das ich mit dem einlesen kein Problem haben werde da ich schon Module für FastA und andere Formate geschrieben habe.
ich denke mit euren Tipps und dem abschließenden Post werde ich es wohl irgendwie auf die Reihe bekommen die File vernünftig einzulesen.
Falls nicht werd ich mich hier an dieser Stelle einfach nochmal melden.
Grüße
Phill
Hallo...
soweit läuft nun alles ich habe nur ein Problem und zwar bekomme ich wenn ich das hier compile:
diesen Fehler:
phil@tux-user:~/GenomeViewer$ python View.py
Traceback (most recent call last):
File "View.py", line 14, in <module>
from TreeView import TreeView
File "/home/phil/GenomeViewer/TreeView.py", line 3, in <module>
import Imports
File "/home/phil/GenomeViewer/Imports.py", line 23
seqline = myfasta.readline()
^
IndentationError: unexpected indent <----
Ich habe aber keine Ahnung woran es liegt... ich denke doch das alles richtig eingerückt etc ist...
Gruß Phill
soweit läuft nun alles ich habe nur ein Problem und zwar bekomme ich wenn ich das hier compile:
Code: Alles auswählen
class Fasta(object):
"""Imports a FastA-File to an internal object"""
head = ""
sequence = ""
def importfasta(self, myfile):
myfasta = file(myfile, 'r')
#read the first line (header)
header = myfasta.readline()
seqline = myfasta.readline()
firstchar = currline[0]
#is file a fasta file?
if firstchar != ">":
print"No Fasta file given"
else:
#read the file up to next Header or up to EOF
while seqline != "" and seqline[0] != ">":
seqline = myfasta.readline()
seqline = seqline.strip()
self.sequence += seqline
# close the stream
myfasta.close()
#get chars to uppercase
self.sequence = self.sequence.upper()
genome.setSequence(self.sequence)
diesen Fehler:
phil@tux-user:~/GenomeViewer$ python View.py
Traceback (most recent call last):
File "View.py", line 14, in <module>
from TreeView import TreeView
File "/home/phil/GenomeViewer/TreeView.py", line 3, in <module>
import Imports
File "/home/phil/GenomeViewer/Imports.py", line 23
seqline = myfasta.readline()
^
IndentationError: unexpected indent <----
Ich habe aber keine Ahnung woran es liegt... ich denke doch das alles richtig eingerückt etc ist...
Gruß Phill
Nein, in der importfasta-Methode vermischt du Leerzeichen und Tabs. Zur Einrückung solltest du immer vier Leerzeichen pro Ebene benutzen und ggf. deinen Editor so umstellen, dass er aus einem Tab vier Leerzeichen macht.
Edit: Noch ein paar Anmerkungen:
- etwas weniger Leerzeilen wären nicht schlecht
- sicher, dass "head" und "sequence" Klassenvariablen sein sollen und nicht zu einer Instanz von Fasta gehören?
- Dateien solltest du mit "open" öffnen und nicht mit "file"
- Kommentare wie "get chars to uppercase" kannst du dir sparen. Sie sollen die Befehle nicht noch einmal in Worten beschreiben, sonder was allgemein passiert und Unterstützung beim Verständnis liefern.
- das Kommentar in Zeile 32 solltest du auf die richtige Ebene verschieben.
Edit: Noch ein paar Anmerkungen:
- etwas weniger Leerzeilen wären nicht schlecht
- sicher, dass "head" und "sequence" Klassenvariablen sein sollen und nicht zu einer Instanz von Fasta gehören?
- Dateien solltest du mit "open" öffnen und nicht mit "file"
- Kommentare wie "get chars to uppercase" kannst du dir sparen. Sie sollen die Befehle nicht noch einmal in Worten beschreiben, sonder was allgemein passiert und Unterstützung beim Verständnis liefern.
- das Kommentar in Zeile 32 solltest du auf die richtige Ebene verschieben.
Das Leben ist wie ein Tennisball.
Ergänzend zu EyDu: Wo kommen `currline` und `genome` her?
Ob eine Zeichenkette mit einem bestimmten Präfix beginnt, würde ich mit der `startswith()`-Methode auf Zeichenketten prüfen.
Wenn es *keine* "fasta"-Datei ist, schliesst Du die Datei nicht wieder.
Aus der ``while``-Schleife würde ich eine ``for``-Schleife machen, die bei entsprechender Bedingung mit ``break`` verlassen wird. Oder man könnte mit den Funktionen aus `itertools` arbeiten. Ungetestet:
Ob eine Zeichenkette mit einem bestimmten Präfix beginnt, würde ich mit der `startswith()`-Methode auf Zeichenketten prüfen.
Wenn es *keine* "fasta"-Datei ist, schliesst Du die Datei nicht wieder.
Aus der ``while``-Schleife würde ich eine ``for``-Schleife machen, die bei entsprechender Bedingung mit ``break`` verlassen wird. Oder man könnte mit den Funktionen aus `itertools` arbeiten. Ungetestet:
Code: Alles auswählen
from itertools import takewhile
def is_not_fasta_header(line):
return not line.startswith('>')
class Fasta(object):
def import_fasta(self, filename):
lines = open(filename, 'r')
header = myfasta.next()
if is_not_fasta_header(header):
raise ValueError('No Fasta filename given')
self.sequence = ''.join(s.strip().upper()
for s in takewhile(is_not_fasta_header, lines))
lines.close()
# genome.setSequence(self.sequence)
hey danke für die Tipps... ich denke so ist der Code schöner und kürzer.
genome ist ein Instanz einer anderen Klasse die Global in dem Modul erstellt wird da nicht nur FastA Datein eingelesen werden müssen.
genome ist ein Instanz einer anderen Klasse die Global in dem Modul erstellt wird da nicht nur FastA Datein eingelesen werden müssen.
Habt ihr vielleicht auch mal überlegt für dieses Projekt eine Datenbank zu nutzen? Meiner Meinung nach sprechen folgende Punkte dafür.
- relative viele Daten
- Daten bereits in einer Tabellenstruktur vorhanden
- scheint sich um ein größeres Projekt zu handeln, bei dem SQL später vielleicht einmal noch sehr nützlich sein kann
Hey,
ja wir haben überlegt das ganze direkt an die NCBI Datenbank zu koppeln. Bis jetzt ist aber noch nicht raus ob das überhaupt gewünscht ist. Sinnvoll wäre es aber in unseren Augen auch. Die Entscheidung liegt aber nicht bei uns. Falls es aber so kommt darf ich mich dann mal an dich wenden wegen SQL?
gruß
phill
ja wir haben überlegt das ganze direkt an die NCBI Datenbank zu koppeln. Bis jetzt ist aber noch nicht raus ob das überhaupt gewünscht ist. Sinnvoll wäre es aber in unseren Augen auch. Die Entscheidung liegt aber nicht bei uns. Falls es aber so kommt darf ich mich dann mal an dich wenden wegen SQL?
gruß
phill