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

Beitragvon martina » Dienstag 17. März 2009, 00:47

Also wie vorher gepostet,hab ich nur den Dreizeiler eingefügt,mehr nicht.

Wenn ich versuche zu starten kommt folgender Fehler:

Hyp.py:17: Warning: 'with' will become a reserved keyword in Python 2.6
File "Hyp.py", line 17
with open(u"%s.xdom" % fname, "r") as data:
^
SyntaxError: invalid syntax

Eventuell unterschieldiche Pythonversionen?

Danke trotzdem für die Hilfe und die Kommentare sind auhc nicht so schlecht :wink:
Es liegt sicher auch viel daran,wie gut man Code versteht. Naja und zugegeben...bin nicht ganz so erfahren damit :( leider
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 17. März 2009, 00:50

Ach so .. welche Python Version nutzt Du? Ich habe das für 2.6 implementiert. Wenn Du 2.5 nutzt kannst du das mit folgendem Hook zum Laufen bringen:

Code: Alles auswählen

from __future__ import with_statement
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Beitragvon martina » Dienstag 17. März 2009, 00:59

Jupp genau,hattest Recht,danke.

Hab wie gesagt dies eingefügt in die def main:

Code: Alles auswählen

 x=os.listdir('.')
 61     for fasta in x:
 62         if fasta.endswith("fasta"):
 63             print fasta

jedoch bekomme ich dann diesen Fehler. Werde nur nicht schlau aus der Namensvergabe.
Da Du in def get_sequence fname übergibts.Also muß ich den Filenamen vorher anpassen?

Pop_cbl10.fasta --> habe mir nur den namen des jeweiligen files ausgeben lassen
Traceback (most recent call last):
File "Hyp.py", line 73, in <module>
main()
File "Hyp.py", line 65, in main
seq = get_domains(fasta)
File "Hyp.py", line 35, in get_domains
seq = get_sequences(fname=xdom_fname)
File "Hyp.py", line 17, in get_sequences
with open(u"%s.xdom" % fname, "r") as data:
IOError: [Errno 2] No such file or directory: u'gi.xdom'
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 17. März 2009, 01:07

martina hat geschrieben:jedoch bekomme ich dann diesen Fehler. Werde nur nicht schlau aus der Namensvergabe.
Da Du in def get_sequence fname übergibts.Also muß ich den Filenamen vorher anpassen?

Nein, den lese ich doch aus der "fasta"-Datein den zeilen 32 & 33 aus! Evtl. passt der RegExp da nicht. ich würde mir mal an der Stelle angucken, wie der Dateiname da aussieht (print!) Ich hab mich beim RegExpr an Deinem Bsp. orientiert - da kann schnell was schief laufen, wenn da Zeichen drin stehen, die ich nicht matche.
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Beitragvon martina » Dienstag 17. März 2009, 01:50

Ah,ja nun hab ich es.
Also der Name,welcher gleich ist zwischen beiden Dateien steht nicht in der Datei,sondern ist der Dateiname-mein Fehler.

Hoffe ich kann was finden,wie man die RegExp auf den Dateiname anwendet.

Danke jedenfalls nochmal für die schnelle und super Hilfe.

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

Beitragvon Hyperion » Dienstag 17. März 2009, 01:53

martina hat geschrieben:Ah,ja nun hab ich es.
Also der Name,welcher gleich ist zwischen beiden Dateien steht nicht in der Datei,sondern ist der Dateiname-mein Fehler.

Also ist die erste Zeile in den "*.fasta" Dateien sinnlos? Ok, ich dachte darüber wird die Verbindung zur zugehörigen xdom-Datei gezogen! Wenn nicht, musst Du die am besten vor der get_domains() Funktion rausfinden und dieser dann einfach mit übergeben.

Aber siehst Du, genau solche Infos sind wichtig! (ich fragte ja vorhin mal, wo ist der Bezug) ;-)
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Beitragvon martina » Dienstag 17. März 2009, 02:06

Jupp,ok hab ich mich doch nicht richtig ausgedrückt. :(

Also wie ich das so mit der Zeit sehe,muß ich das dann wohl noch ganz schön versuchen azupassen,da die ganzen RegExp ja auf die erste Zeile angesetzt sind-da Du verstanden hatest,daß dort die Gemeinsamkeit liegt und nicht im Dateinamen.
:?
Dann werde ich mir noch stark den Kopf zerbrechen müssen :oops: ,geht ja nicht so schnell bei mir.

Also dann danke für die Hilfe :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 17. März 2009, 02:10

Kein Problem! Aber eigentlich ist es doch nicht so schlimm! Es ist ja nur die eine Stelle, die "weg" muss.

Code: Alles auswählen

def get_domains(fname, xdom_fname):
    with open(fname, "r") as data:
        metas = data.read()
    # Nun den Namen nehmen, der übergeben wird
    seq = get_sequences(fname=xdom_fname)
    # Sequenzen finden
    seq_parts = []
    for lines in re.findall(PARAMS, metas):
        start, end, seq_name = lines.split()
        seq_parts.append(seq[int(start): int(end)])
    return seq_name, seq_parts

Das sollte es doch sein.

Nun musst Du nur noch vorher eben den zugehörigen Dateinamen suchen und ihn an get_domians() mit übergeben.

Der Rest sollte dann weiterhin funzen!
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Beitragvon martina » Dienstag 17. März 2009, 02:48

Jetzt hab ich genau das gleiche Problem wie schon einmal zu Beginn mit meinen 'alten funktionen'
er kennt das line.split nicht:

Traceback (most recent call last):
File "Hyp.py", line 95, in <module>
main()
File "Hyp.py", line 87, in main
seq_name,seq_parts = get_domains(fname,xdom_fname)
File "Hyp.py", line 33, in get_domains
start, end, seq_name = lines.split()
ValueError: need more than 1 value to unpack

habe gerade auch noch gesehen, dass er die Sequenz dh ab der 2.Zeile im fasta(sieht zb so aus AJHENDJKKMBVDTESSC), garnicht die Sequenz nimmt,sondern stattdessen hat der den Inhalt des xdom-files. :?
Benutzeravatar
snafu
User
Beiträge: 5424
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 17. März 2009, 03:54

martina hat geschrieben:Jetzt hab ich genau das gleiche Problem wie schon einmal zu Beginn mit meinen 'alten funktionen'
er kennt das line.split nicht:

Code: Alles auswählen

ValueError: need more than 1 value to unpack


Da steht nicht, dass er es nicht kennt, sondern dass `split()` eine Sequenz mit 1 Wert erzeugt und du mehr Namen zum Binden vergibst als Werte zum Verteilen vorhanden sind. Python sagt dir normalerweise sehr genau was das Problem ist. Anstatt die Fehlermeldung umzudeuten, müsstest du vielmehr überlegen, warum hier nur 1 Wert übrig bleibt, obwohl du ja offenbar 3 Werte erwartest.
shcol (Repo | Doc | PyPi)
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Beitragvon martina » Mittwoch 18. März 2009, 12:33

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: 5424
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Mittwoch 18. März 2009, 12:52

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

Beitragvon martina » Mittwoch 18. März 2009, 16:06

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

Beitragvon martina » Mittwoch 18. März 2009, 23:03

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

Beitragvon BlackJack » Donnerstag 19. März 2009, 07:48

@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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder