PTT Datein einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

Hallo zusammen...

ich versuche gerade ein Modul zu schreiben womit PTT files eingelesen werden können.
Hier ein Beispiel für PTT files:
http://www.cse.wustl.edu/~jbuhler/resea ... splay.html

wie ihr seht ist es eigentlich nur eine zeilenbasierte Textdatei.
Das Zeilenweise einlesen ist auch nicht das Problem, das Problem welches ich im Moment habe ist das die einzelnen Spalten der Datei eben auch getrennt werden müssen.

Es müsste also möglich sein z.B. unterschiedliche Listen zu erstellen die die einzelnen Spalten speichern. So das z.B. die Daten aus Zeile eins jeweils an der ersten Position der jeweiligen Liste steht etc.
so sollte es dann durchs ganze file gehen das ich nachher für jede Spalte eine List oder ähnliches habe. (müssen keine Listen sein wenn jemand nen besseren Vorschlag hat bin ich sehr dankbar!)
Wenn ich nun aus jeder Liste stelle 1 ausgeben lasse sollte die erste Zeile der eingelesenen file vollständig da sein.

Ich hab schon gesehen das es so etwas wie >>foo.split<< o.ä. gibt aber ich habe im moment noch keine Ahnung wie ich dies richtig benutzen kann.

Vielen dank für eure Hilfe..

Grüße Phill
BlackJack

Die einzelnen Spalten sind mit Tabulatorzeichen getrennt, da kann man also prima mit dem `csv`-Modul dran gehen.

Und musst Du wirklich Listen pro Spalte haben, oder ginge auch eine Liste mit Zeilen? Das wäre Grundsätzlich nämlich erst einmal einfacher.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Code: Alles auswählen

for zeile in ptt:
   zellen = zeile.split("\t") # oder .split(" ") falls es space-separated ist
du könntest das aber auch mit dem csv-reader modul probieren.
http://www.kinderpornos.info
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vielleicht noch ein Hinweis auf den maxsplit-Parameter der split-Methode. Damit kannst du die Beschreibungen am Ende einer Zeile behandeln.
Das Leben ist wie ein Tennisball.
BlackJack

Und natürlich könnte man mal schauen ob Biopython das Format kennt. Man muss ja nicht das Rad neu erfinden.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

EyDu hat geschrieben:Vielleicht noch ein Hinweis auf den maxsplit-Parameter der split-Methode. Damit kannst du die Beschreibungen am Ende einer Zeile behandeln.
schick, das kannte ich nicht. aber in der beschreibung stehen eh keine tabs.
http://www.kinderpornos.info
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

hey...

danke für die schnelle antwort(en)!

also es müssen keine listen sein es soll einfach nur in nem objekt gespeichert werden können damit man die nachher weiter verwenden kann also wenn jemand ne bessere lösung hat immer raus damit!

und an biopython hab ich noch garnicht gedacht!

mfg phil
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

inwiefern weiterverwenden?

so?

protein.location(10000).length
protein.PID(4711).synonym

naja auf jeden muss du die einzelnen zellen greifbar machen, dazu muss der kram erstmal in listen. wie auch immer...
http://www.kinderpornos.info
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

Es soll nachher so sein das ich dann z.B. das gesamte E.Coli genom darstelle (als text) und dann die Location einfärben kann. Also ich stelle das genom im textformat da und lese dann aus der liste mit den Locations die zahlen raus und färbe es ein aber erstmal mss ich das alles speichern können...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

das ist ja dann schon ein etwas grösseres projekt.
jedenfalls relativ zu deinen python-skills.

du solltest das entweder jemand machen lassen, der das kann oder du musst dir erstmal die grundlagen draufschaffen.
http://www.kinderpornos.info
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

naja ich bin ja nich allein der das endprodukt nachher machen soll... und das programmieren ist glaub ich auch nicht das problem da ich in java und c(++) eigentlich fit bin. ich komm eben nur im moment mit der syntax (die wenigen klammern sind so komisch) nicht so wirklich klar und ich glaube mir fehlt einfach ein wenig der überblick was alles geht in python.
vorerst sollte aber dieses import der datei funktionieren. die einzige frage die ich nun noch habe,

Code: Alles auswählen

for zeile in ptt:
   zellen = zeile.split("\t")

schreibt ja nur in die Zellen... wie kann ich das denn nun variieren also das nach jedem tab auch in eine andere liste geschrieben wird?
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hi phill,

ich bin mir nicht ganz sicher, aber ich glaube Du suchst so etwas hier:

Code: Alles auswählen

zellen = []    # zellen ist jetzt eine leere Liste
for zeile in ptt:
   zellen.append( zeile.split("\t") )  # jetzt wird die Liste der Einträge in jeder Zeile an die Liste zellen angehängt
Du erhälst so eine Liste von Listen, auf die Du wie auf ein Array zugreifen kannst:

Code: Alles auswählen

>>> a=[[1,2,3],[2,3,4],[4,5,6]]
>>> a
[[1, 2, 3], [2, 3, 4], [4, 5, 6]]
>>> a[1][2]
4
>>> a.append([8,9,0])
>>> a
[[1, 2, 3], [2, 3, 4], [4, 5, 6], [8, 9, 0]]
Hilft das?
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

phill hat geschrieben:naja ich bin ja nich allein der das endprodukt nachher machen soll... und das programmieren ist glaub ich auch nicht das problem da ich in java und c(++) eigentlich fit bin. ich komm eben nur im moment mit der syntax (die wenigen klammern sind so komisch) nicht so wirklich klar und ich glaube mir fehlt einfach ein wenig der überblick was alles geht in python.
ja, python sieht erstmal seltsam aus. es wird sich auch seltsam verhalten, wenn du mit dem whitespace nicht aufpasst (nie tabs und spaces mischen).

du solltest dir auf jedenfall _das_ tutorial durchlesen.

http://docs.python.org/tutorial/

da sieht man schon einiges. "was alles geht" in python... :)
ich nutze es jetzt schon einige jahre wenn ich mal ein schnelles skript brauche und stolpere immer wieder über was neues. hier sind aber auch einige die sich wirklich intensiv mit der sprache auseinandersetzen und wenn du hier code postest kriegst eigentlich immer mindestens ein sehr hilfreiches review und lernst wie man es am besten macht in python.
http://www.kinderpornos.info
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hi phill,

ich habe mein Beispiel von oben ein wenig ausgearbeitet. Für das Verstehen ist mein Beispiel oben besser. Ausführlicher und letztlich nützlicher ist folgendes lauffähiges Programm:

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 = []    # enthaelt nachher die Start-Locations
    stops = []    # enthaelt nachher die Stop-Locations

    for zeile in zellen:
        print "Gen beginnt bei ",zeile[0].split("..")[0], " und endet bei ", zeile[0].split("..")[1]
        starts.append( int( zeile[0].split("..")[0] ) )
        stops.append( int( zeile[0].split("..")[1] ) )
    
    return starts,  stops


zellen =   [                   # nur ein paar Beispieldaten als Liste aus Listen aus Strings
     ["90..255","+","21","16127995	thrL	b0001333","..."],
     ["337..299","+","820","16127996 thrA b0002","..."],
     ["2801..3733","+","310","16127997	thrB	b0003","..."],
     ["3734..5020","+","428","16127998 thrC	b0004","..."]   ]
 
anfaenge,  enden = startstop(zellen)    
print "\n\nListe der Startlocations: ", anfaenge
print "\n\nListe der Stoplocations: ", enden
Gruß,
Bernhard
BlackJack

Wobei ich gerne noch einmal darauf hinweisen möchte, dass es in der Regel sinnvoller ist die zusammengehörigen Daten einer Zeile als *ein* Objekt zu verwalten und nicht in verschiedene Listen aufzuteilen. Dann fängt man irgendwann an, sich die Daten über den Index wieder zusammen zu suchen, also so hässliche ``for i in xrange(len(eine_liste)):``-Konstrukte zu verwenden, statt direkt über die Elemente einer Liste zu iterieren.

@Bernhard: Du verwendest da IMHO *etwas* zu oft `split()` und Indexzugriffe. Das ist nicht schön, schon gar nicht in Python, wo's doch "tuple unpacking" bzw "sequence unpacking" gibt. (Was eigentlich "iterable unpacking" heissen sollte. :-))
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

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 :P . Ich bin selbst noch nicht sehr weit im Python Lernen.
BlackJack

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
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

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ß
BlackJack

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.
Bernhard
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:
Das Zeilenweise einlesen ist auch nicht das Problem
Gut. Bist Du sicher?
das Problem welches ich im Moment habe ist das die einzelnen Spalten der Datei eben auch getrennt werden müssen.
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.
Es müsste also möglich sein z.B. unterschiedliche Listen zu erstellen die die einzelnen Spalten speichern.
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.
und lese dann aus der liste mit den Locations die zahlen raus
...und das ist schon vorbereitet, weil die zitierte Funktion Dir bereits die Locations als Integer zurückgibt.
müssen keine Listen sein wenn jemand nen besseren Vorschlag hat bin ich sehr dankbar!)
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.
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
Antworten