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

Montag 16. März 2009, 18:35

Hi @ all,

hier nochmals mein Code, den ich bis jetzt versucht habe zu ändern,jedoch treten noch folgende Probleme aus:

1.Es wird die Sequenz eingelesen, gespeichert. Auch anhand des xdom-files wird
start,end herausgesucht und mittels print kann ich mir diese ausgeben lassen,jedoch
werden die Sequenzen nicht in das output file egschrieben.
2. Ebenfalls habe ich noch das Problem,dass er nachdem keine weiteren start und
stops im xdom file sind, nicht ein neues fasta-file mit neuer seuqenz aus dem ordner
nimmt,sondern immernoch die gleiche sequenz hat. Dies müßte ja etwas mit der
Beendigung der Schleife zu tun haben,würde ich denken. Habe schon hin und her
probiert,jedoch weiß ich nicht mehr was ich ändern muß, um den gewünschten Erfolg
zu erhalten :(

Wie gesagt,aber es funktioniert jedoch schon mehr als gedacht.
Nochmals mein Code,sorry :-(

Code: Alles auswählen

def sequence(file):
    seq=""
    file=open(file)
    for line in file:
        if ">" in line:
            continue
        print 'in sequence'
        print seq
        seq+=line.replace("\n","")
    return seq

def domains(fname,seq):
            output=open(fname+"._0.1.pfam.10.fa",'w')
            file=open(fname)   
            print file,"file"
            print seq ,"seq in dom"
            for line in file:
                if ">" in line:
                    continue
            print 'in domains'
            start=int(line.split()[0])
            end=int(line.split()[1])
            name=line.split()[2]
            test=seq[(start)-1:end]
            print test,"domain"
            output.write(">"+name+"\n"+test+"\n")

#main

x=os.listdir('.')

for file in x:
    if file.endswith("fasta"):
        seq=sequence(file)
        fname=file.split('.')[0]
        for fname in x:
           if fname.endswith(".xdom"):
               file=open(fname)
               domains(fname,seq)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 16. März 2009, 19:51

Also in Zeile 36 überschreibst Du ja "fname", was Du in Zeile 35 angelegt hast? Was willst Du damit beabsichtigen?

Wieso testest Du das ganze nicht einfach erst einmal mit zwei Dateien? Damit wirst Du die "parsing" Probleme schneller finden. Der Rest ist doch bloßes iterieren.

Letzteres kann man doch testen (bzw. sich eine Funktion schreiben, die genau die Pärchen zusammenstellt), ohne dass die Dateien geöffnet werden müssen usw.

Wenn beides passt, montierst Du es einfach zusammen.

Evtl. könntest Du noch einmal posten, wie denn diese Dateien aufgebuat sind, also sample Dateien. Sollten diese länger sein, packe sie in paste.pocoo.org.

Ach ja, Du überschreibst das Built-in "file" - das macht hier vermutlich nichts, sollte man aber besser nicht tun!
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Montag 16. März 2009, 20:14

Hi,
habe meine Testdateien schon auf 2 begrenzt, um Fehler zu finden.

hatte das file überschrieben, da ich dachte man kann die gleiche Variable nicht doppelt verwenden?! ODer gilt dies nicht für file, da es fesgelegt ist bei Python das somit immer die jeweilige Datei gemeint ist? Dies wurde mir so angetragen, das es sonst nicht funktionieren würde,da man den vorherigen namen des files nicht mehr im Spreicher hätte? Hatte es nämlich ansonsten auch zu Beginn mit 'file' in beiden Schleifen.

Um die das jeweilige Pärchen zu finden, muß ich einfach Teile aus meinen Code verwenden,oder? Da ich ja schon die beiden passenden Pärchen versuche zu finden bzw es auch gefunden wird.

Dumme Frage,aber wie stelle ich die Files auf paste.pocoo.org.? habe so etwas noch nie gemacht. sorry.

Vielen Dank für die Hilfe
MArtina
martina
User
Beiträge: 29
Registriert: Montag 19. Januar 2009, 17:45

Montag 16. März 2009, 20:20

HAb es online gestellt,
hoffe du kannst darauf zugreifen?

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

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

Montag 16. März 2009, 20:25

martina hat geschrieben:Hi,
habe meine Testdateien schon auf 2 begrenzt, um Fehler zu finden.
Ja, aber ich würde die Probleme dennoch anders angehen! Zum Parsen zwei fest definierte Datein (+ ggf. eine neue Output Datei), zum Pärchen finden ruhig in den Original-Ordner gehen und dort Suchen.
hatte das file überschrieben, da ich dachte man kann die gleiche Variable nicht doppelt verwenden?! ODer gilt dies nicht für file, da es fesgelegt ist bei Python das somit immer die jeweilige Datei gemeint ist? Dies wurde mir so angetragen, das es sonst nicht funktionieren würde,da man den vorherigen namen des files nicht mehr im Spreicher hätte? Hatte es nämlich ansonsten auch zu Beginn mit 'file' in beiden Schleifen.
Nein, Du verstehst das falsch. Wähle für file einfach einen anderen Bezeichner! Du findest hier ...
http://docs.python.org/library/functions.html
... nämlich eine Built-in Funktion, die file() heißt! So etwas kann zu Problemen führen.
Um die das jeweilige Pärchen zu finden, muß ich einfach Teile aus meinen Code verwenden,oder? Da ich ja schon die beiden passenden Pärchen versuche zu finden bzw es auch gefunden wird.
k.A. - ich habe mir diesen Code nicht so genau angeguckt - aber es sieht nicht grad sauber aus! Klappt es denn? Wenn Du das nur mit 2 Dateien testest, sagt das ja nicht grad viel darüber aus ;-)
Dumme Frage,aber wie stelle ich die Files auf paste.pocoo.org.? habe so etwas noch nie gemacht. sorry.
Du siehst doch ein großes Eingabefeld. Dort kopierst Du Deinen Code / Datei usw. rein. Darunter hast Du noch eine Auswahlbox, mit der Du ggf. das Highlighting einstellen kannst (z.B. bei Python Quelltest). Wenn Du das Markup nicht kennst, dann ist "Text" (voreingestellt!) die richtige Wahl. Danach klickst Du auf "paste".

So schwer ist das doch nicht ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 16. März 2009, 20:41

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

Montag 16. März 2009, 20:56

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

Montag 16. März 2009, 21:15

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

Montag 16. März 2009, 21:27

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

Montag 16. März 2009, 22:27

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

Montag 16. März 2009, 22:40

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

Montag 16. März 2009, 23:57

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

Dienstag 17. März 2009, 00:01

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

Dienstag 17. März 2009, 00:26

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

Dienstag 17. März 2009, 00:40

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