listdir- aus 2 gleichen files- daten lesen+suchen

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.
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hi,

danke für die Info, lerne immer gern dazu. Und wie es schon heißt 'Nur aus Fehlern lernt man' :?

Naja deswegen wollte ich noch fragen, ob mir jemand bei der Erstellung einer Liste helfen kann.

Ich habe einen Ordner voll Dateien. Es gibt jeweils immer ein Pärchen von Dateien die zb Klaus.fasta und Klaus.758.xdom, Erna.fasta Erna.785.xdom,...usw heißen.
Wie bekomme ich eine Liste mit immer genau diesem Pärchen und wie kann ich diese dann verwenden.
Habe das Ganze schon mit

Code: Alles auswählen

name.split() 
usw versucht, jedoch habe ich am Ende dann ein Kuddelmuddel, da ich immer wieder die Endung anhängen bzw splitten muß. Und es doch nicht so ganz funktioniert. :-(
Gibt es da eine elegantere Lösung?
Ich möchte beide Dateien verwenden, dh aus Ihnen in Abhängigkeit Werte lesen (aus xdom Werte nehen um sie in fasta heraus zu filtern und in ein neues file (was genau den gleichen namen wie xdom hat,nur mit' .fa' angehängt, schreiben.

Hyperion hat mr ja schon sehr geholfen bei meinen Problemen vorher,danke nochmals

Wäre für jede weitere Hilfe,Anregung dankbar.
Martina
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

In [13]: l = ['Klaus.fasta', 'Klaus.758.xdom', 'Erna.fasta', 'Erna.785.xdom']

In [14]: fastas = [filename for filename in l if filename.endswith('.fasta')]

In [15]: xdoms = [filename for filename in l if filename.endswith('.xdom')]

In [16]: zip(fastas, xdoms)
Out[16]: [('Klaus.fasta', 'Klaus.758.xdom'), ('Erna.fasta', 'Erna.785.xdom')]
Für die spätere Verwendung würd ich's aber eher so machen:

Code: Alles auswählen

In [17]: fastas = (filename for filename in l if filename.endswith('.fasta'))

In [18]: xdoms = (filename for filename in l if filename.endswith('.xdom'))

In [19]: from itertools import izip

In [20]: merged = izip(fastas, xdoms)

In [21]: merged
Out[21]: <itertools.izip object at 0xa119b4c>

In [22]: for elem in merged: print elem
   ....: 
('Klaus.fasta', 'Klaus.758.xdom')
('Erna.fasta', 'Erna.785.xdom')
Allerdings musst du im Interpreter dann immer eine `for`-Schleife (wie im Beispiel) benutzen, um die Elemente anzuzeigen. Dafür ist's aber performanter im Skript. :)
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hi snafu,

vielen lieben Dank,das war genau das was ich gesucht habe.
Allerdings, sorry, aber versuche ich nun die ganze Zeit auf ein einzelnes Element eines Pärchen zurück zu greifen, dh zb Klaus.fasta in einer Funktion abarbeiten und die Ergbenisse davon dann in eine nächste Funktion übernehmen.
In dieser öffne ich Klaus.5646.xdom, um Daten hieraus als Parameter für Teile aus fasta zu verwenden. Mh...sorry etwas schief vllt.
an einem Bsp:

Klaus.fasta öffnen,sieht so aus:
>agsbdh
KDNGHJFMECINQWFFFDSKASLLLLLLLLLLLLLLLLASDDDDDDASSS

-> nur ab der zweiten Zeile lese ich die Daten aus und speichere sie in seq"".

nun öffne ich Klaus.6447.xdom,sieht so aus:
>hdhdjk
2 9 name1 78
8 20 name2 2

ich benötige wieder nur die daten ab der zweiten zeile und nur die ersten 3 elemnete aus jeder zeile.
Diese entsprechen start,stop und name

nun soll aus seq für Klaus.fasta jede zeile aus klaus578.xdom heraus gefiltert werden (dh von start,end).
in einem neuen file Klaus7895.xdom.fa (nur Endung fa wird angehangen) soll es folgendermaßen aussehen:

>name1
DNGHJFME (entspricht 2-9)
>name2
KFSNFIQWRENMEFI(entspricht 8-20)

soweit funktioniert auch schon das meiste davon.
Es wird die seq für ein fasta eingelesen zb Klaus.fasta.
Das Schreiben in ein neues files mit seqteilen aus dem xdom gelesen,funktioniert auch,

Jedoch habe ich das Problem bzw Probleme:
1.wie sage ich ihm das er nur das eine Pärchen verwenden soll und erst danach das nächste dh zuerst Klaus.fasta und Klaus765.xdom und erst daanch Erna
2.an welcher Stelle setze ich den Vergleich bzw sage ihm welches Pärchen er nehmen soll? (in die funkiton,in die main,...?

Sorry,aber irgendwie habe ich das probiert,aber es funktioniert nicht mit meiner Herangehensweise :(

Danke schonmal für die Hilfe, auch wenn es wahrscheinlich für alle bzw die meisten unter Euch kein Problem ist sowas zu erstellen.

Danke,Martina
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hi@ all,

ich wollte nun noch einmal Rückmeldung geben.
Soweit funktioniert snafu's Code für 2 Testbeispielen.
Jedoch habe ich nun diesen Code bzw mein ganzes Skript auf einen ganzen Ordner angwendet,wobei sich die Dateinamen teilweise nur durch Zahlen unterscheiden.
zb Klaus12.fasta ,Klaus11.fasta und ebenfalls dazugehörige Dateien mit Endung xdom zb Klaus12._10pfa.xdom, Klaus11._10pfa.xdom usw

Nun habe ich das Probelm dass alle fasta's mit xdom's willkürlich zusammen gefügt werden in der Liste :-(
Jedoch ist dies nicht tragbar für mein Problem,da ich immer genau DAS Pärchen benötige und abarbeiten will.

Wäre für jeden weiteren Tip dankbar.

Martina
BlackJack

@martina: Du könntest die `*.fasta`-Dateinamen ermitteln und dann für jeden Namen eine Suchmaske für `glob.glob()` für den dazugehörigen `*.xdom`-Namen erstellen.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ungetestet:

Code: Alles auswählen

from glob import glob
from itertools import izip

fastas = glob('*.fasta')
xdoms = [glob('%s.*.xdom' % name.split('.')[0]) for name in fastas]

izip(fastas, xdoms)
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Danke snafu,

so funktioniert es,jedoch kann ich komischerweise nicht auf das jeweilige xdom-elemnt nicht zugreifen.

ich habe ne schleife mit

Code: Alles auswählen

if filename.endswith('fasta'):
diese wird auch ausgeführt, jedoch bekomme ich die dazugehörige xdom datei nicht geöffnet bzw bearbeitet :x

ich habe schon hin und her probiert, mit Einrückung usw,jedoch funktioniert es nicht.

Kann mir eventuell nochmal jemand helfen
:oops: ,sorry
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hi@all,

nochmals VIELEN,VIELEN DANK :D :D :D für die ganze Hilfe von Euch.

Nun hab ich das Skript endlich zum Laufen bekommen und hab viel dazu gelernt.

IHR SEID SPITZE

Martina
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na das freut mich :-)

Vielleicht könnteste das noch mals pasten? Vielleicht kann man da noch was verbessern ;-)
Antworten