Seite 2 von 3

Verfasst: Dienstag 17. März 2009, 00:47
von martina
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

Verfasst: Dienstag 17. März 2009, 00:50
von Hyperion
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 

Verfasst: Dienstag 17. März 2009, 00:59
von martina
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'

Verfasst: Dienstag 17. März 2009, 01:07
von Hyperion
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.

Verfasst: Dienstag 17. März 2009, 01:50
von martina
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

Verfasst: Dienstag 17. März 2009, 01:53
von Hyperion
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) ;-)

Verfasst: Dienstag 17. März 2009, 02:06
von martina
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 :)

Verfasst: Dienstag 17. März 2009, 02:10
von Hyperion
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!

Verfasst: Dienstag 17. März 2009, 02:48
von martina
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. :?

Verfasst: Dienstag 17. März 2009, 03:54
von snafu
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.

Verfasst: Mittwoch 18. März 2009, 12:33
von martina
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

Verfasst: Mittwoch 18. März 2009, 12:52
von snafu

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. :)

Verfasst: Mittwoch 18. März 2009, 16:06
von martina
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

Verfasst: Mittwoch 18. März 2009, 23:03
von martina
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

Verfasst: Donnerstag 19. März 2009, 07:48
von 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.

Verfasst: Donnerstag 19. März 2009, 09:04
von snafu
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)

Verfasst: Donnerstag 19. März 2009, 12:40
von martina
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

Verfasst: Donnerstag 19. März 2009, 18:31
von martina
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

Verfasst: Donnerstag 19. März 2009, 19:46
von Hyperion
Na das freut mich :-)

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