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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

martina hat geschrieben:HAb es online gestellt,
hoffe du kannst darauf zugreifen?

http://paste.pocoo.org./show/108201/

Martina
Ok, welche der beiden Dateien ist denn das nun? Und wie hängen diese zusammen? Sorry aber Deine bisherigen Erklärungen sind zu wirr, um es zu kapieren, was da genau passiren soll!

Zeige doch mal anhand der Dateien (und deren Namen), wie was zusammenhängt, woraus wann was abgeleitet und was überhaupt geändert oder neu generiert werden soll!
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Sorry,

also das was nach >Ory_cbl5_fasta wäre dann Datei Ory_cbl5.fasta in meinem Bsp.
alles was nach >Ory_cbl5_xdom steht wäre Datei Ory_cbl5._0.1.pfam.10.xdom
mit den anderen beiden Bsp genauso.

in meinem Code funktioniert es bis jetzt so.
Die zb Sequenz aus Ory_cbl5.fasta wird eingelesen und als 'seq' abgespeichert.
Durch splitten des namens wird die dazugehörige xdom-Datei im Ordner gesucht.
Anschließend wird Ory_cbl5._0.1.pfam.10.xdom geöffnet und Zeile für Zeile gesplittet(man erhätl start,end und name) und die Sequenz für die jeweilige Zeile in ein output file namens Ory_cbl5._0.1.pfam.10.xdom._0.1.pfam.10.fa abgespeichert.

Nun bin ich so weit,dass auch die jeweiligen Sequenzteile(dh wenn in xdom 3 zeilen sind mit start,end und name) in das zugehörige outputfile geschrieben wird.
Jedoch, wie schon gesagt ändert er die Sequenz bzw das fasta file nicht, um dann das dazugehörige xdom file zu öffnen.
dh er öffnet und merkt sich die Sequenz für Ory_cbl5.fasta, aber sucht die zugehörigen start und ends für alle xdom-files (hier Pop_cbl10._0.1.pfam.10.xdom._0.1.pfam.10.xdom, und Ory_cbl5._0.1.pfam.10.xdom._0.1.pfam.10.xdom)

Aber es müßte ja so funktionieren, daß für Pop...xdom auch nur die Pop...fasta verwendet wird und deren resultierenden Sequenz.

War das besser verständlich? Sorry, geb mir Mühe es nicht allzu verwirrend zu beschreiben :oops:

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

Ja, schon besser - aber noch nicht perfekt ;-)

Also ich sage jetzt einmal, was ich bisher verstanden habe:
- Du hast jeweils 2 Dateien (eine mit "_xdom" und eine mit "_fasta"), die "zusammengehören".

- Du willst jeweils die Dateien eines Pärchens einlesen und bei der "_xdom" Datei diese Zeilenweise auslesen, so dass Du auf jede Zeile einzeln zugreifen kannst.

- Es soll eine neue Datei geschrieben werden.

Was ich noch nicht kapiert habe:
- Ist der Dateiname der "neuen" Datei willkürlich?

- Wie genau soll die "neue" Datei aussehen? Was soll da reingeschrieben werden? Wie hängt "das" mit den beiden zuvor geöffneten Dateien zusammen?

Bitte beschreibe nicht, was Dein Code bisher macht, sondern was Du erreichen willst!
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Ok, geb mir Mühe :)

ja genau die Sachen hattest du richtig verstanden.

Der Name der neuen Datei ist nicht willkürlich,sondern er hat die Endung des xdom-files+fa dh als Bsp Ory_cbl5._0.1.pfam.10.xdom._0.1.pfam.10.fa ist auch so im integriert Code und funktioniert. Ist vielleicht etwas verwirrend, aber günstig für mich,da dann vorherige Aktionen sofort ersichtlich sind für mich.

diese Datei soll folgendermaßen aussehen:
>PF00036
FKLYDLRQTGFIERHELKEMVLALLDESD
>PF00036
EMIVDRTFDQADTKGDERIDQEEWNEFVK
>PF00036
DLTMVFPSFVIHSEVSEADMVA


nach dem'>' ist der 'name' (3.Spalte in xdom) der jeweiligen Zeile des xdom files und in der nächsten Zeile die Sequenz der jeweiligen start(1.Spalte) und endpunkte(2.Spalte) aus dem xdom-file.


nochmal zum aussehen des xdom's:
>name(spielt aber keine Rolle zum Auslesen)
start end name
start end name
...
Weshalb öffen ich die Dateien?
Ich muß die Dateien xxx.fasta und xxx.xdom doch öffnen, um zu 'wissen' von welchem start bis welchem Endpunkt ich aus der Sequenz(fasta) raussuchen muß und den dazugehörigen Namen zu erfahren.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, jetzt hab ich es verstanden. Wie ich vermutete sind das zunächst einmal gut zwei Probleme, die man leicht getrennt angehen kann!

1.) Parsing Probleme lösen
2.) Pärchen finden

So, ich versuche mich mal an ersterem.
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hi,
also da sich mein Code ein wenig verändert hat,poste ich ihn nochmal.
Hoffe ist nicht zuviel.

Code: Alles auswählen

def sequence(f):
  4     seq=""
  5     f=open(f)
  6     for line in f:
  7         if ">" in line:
  8             continue
  9         print 'in sequence'
 10         seq+=line.replace("\n","")
 11     return seq
 12     
 13 def domains(fname,seq):
 14     output=open(fname+".fa",'w')
 15     f=open(fname)   
 16     print output
 17     for line in f:
 18         if ">" in line:
 19             continue
 20         print 'in domains'
 21         start=int(line.split()[0])
 22         end=int(line.split()[1])
 23         name=line.split()[2]
 24         test=seq[(start)-1:end]
 25         output.write(">"+name+"\n"+test+"\n")
 26     return test
 27     
 28 #main
 29 
 30 x=os.listdir('.')
 31 
 32 for f in x:
 33     if f.endswith("fasta"):
 34         seq=sequence(f)
 35         fname=f.split('.')[0]
 36         print"erstes",fname
 37     for fname in x:
 38         print "fname",fname
 39         if fname.endswith(".xdom"):
 40             print fname,"xdom"
 41             test=domains(fname,seq)

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

So, hier mal mein Ergebnis:
http://paste.pocoo.org/show/108242/

Es fehlt das Rausfinden der "fasta"-Dateien - aber das bekommste sicherlich hin :-)

Ansonsten sollte das so tun. Du musst nur beachten, ob die Zeilenumbrüche in den xdom Dateien so korrekt rausgefiltert werden (Zählen die mit oder nicht?). Ich habe immer noch ein "\r" in den Sequenzen. Das wird wohl an den Windows-Zeilenumbrüchen liegen könnte ich mir vorstellen. Da musst Du eben noch ein wenig experimentieren.
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hi,

vielen Dank für die schnelle Antwort und Deine Mühen.

Werde es gleich mal ausprobieren :)

Nochmals vielen lieben Dank und schönen Abend noch
MArtina
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Hi,
also wie gesagt,bin sehr dankbar für Deine Hilfe, muß aber nochmal nachfragen, da es mir etwas schwer fällt 'fremden' Code zu lesen.

habe jetzt in die def main folgendes reingetan,

Code: Alles auswählen

  x=os.listdir('.')
 60     for fname in x:
 61         if fname.endswith("fasta"):

aber es gibt einen Fehler in Zeile 17 bei def get_sequence
with open(u"%s.xdom" % fname, "r") as data:

zuerst würde mich interessieren, was das 'u' in der Klammer bedeutet?

Desweiteren habe ich die RegExps noch nie benutzt :oops:

Scheint als ob es doch nicht so einfach für mich ist,den Code noch zu vervollständigen :roll:

Werd noch versuchen ein wenig rumzubasteln*gg

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

martina hat geschrieben:Hi,
also wie gesagt,bin sehr dankbar für Deine Hilfe, muß aber nochmal nachfragen, da es mir etwas schwer fällt 'fremden' Code zu lesen.
er ist ja auch nicht perfekt kommentiert ;-)
aber es gibt einen Fehler in Zeile 17 bei def get_sequence
Welchen denn?
zuerst würde mich interessieren, was das 'u' in der Klammer bedeutet?
Das deklariert den String nur als "unicode"-String. Mehr zu dieser Problematik findest Du hier in zig Threads :-D
Desweiteren habe ich die RegExps noch nie benutzt :oops:
Macht nichts - ich nutze sie auch nicht oft, aber manchmal sind sie eben hilfreich.
Scheint als ob es doch nicht so einfach für mich ist,den Code noch zu vervollständigen :roll:
Hm ... wo genau hapert es denn? Imho war das ja erst einmal nur das Finden aller ".fasta" Dateien und das Abarbeiten meines Codes in einer Schleife.

Ok, vorher würde ich den Rest einmal mit vorhandenen Files testen ... we ich das hier ja auch gemacht habe.

Poste doch mal exakt den Fehler!
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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

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