PTT Datein einlesen

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.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Das mit den gehäuften .splits gestehe ich sehr gerne zu, wobei ich davon ausgehe, dass nach einem ersten Testen der Funktion die Zeile 8 ohnehin als erstes gelöscht wird und dann bleibt nur noch die Hälfte übrig.

Das Aufteilen auf verschiedene Listen ist sicher unelegant, wahrscheinlich aber für einen C Programmierer leicht zu handeln. In jedem Fall danke für die Hinweise :P . Ich bin selbst noch nicht sehr weit im Python Lernen.
BlackJack

Python ist aber nun mal kein C. In Python sähe die Funktion eher so aus (ungetestet):

Code: Alles auswählen

def startstop(zellen):
     """Liest den Zellen jeweils das erste Element aus und gibt je eine Liste
     der Start- und der Endpunkte jedes Gens zurueck.
     """
     starts = list()
     stops = list()
 
     for start, stop in (map(int, row[0].split('..')) for row in zellen):
         print 'Gen beginnt bei %d und endet bei %d.' % (start, stop)
         starts.append(start)
         stops.append(stop)
     
     return starts, stops
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

Hallo zusammen...

erstmal vielen vielen dank für die viele resonanz.
Das Problem was ich habe ist das es ja insgesamt 5 oder 6 Spalten sind.
D.h. die Zellen die ich benutze brauchen 5 oder 6 segmente. Ich hab aber keine Ahnung wie ich diese Zellen definieren soll bzw die zuordnung einer Zeile auf das jeweilige Segment vornehme.


Gruß
BlackJack

Also ich zähle da 9 Spalten!? Was meinst Du mit "Zellen" und "Segmenten"? Versuch besser "Python" mit uns zu sprechen. ;-) Da haben wir Listen und die haben Elemente.

Du brauchst doch nur bis zur ersten Datenzeile "überspringen" und kannst dann ganz einfach die Zeilen lesen, an '\t' zerteilen und diese Listen dann in eine Liste stecken. Schon hast Du eine zweidimensionale Datenstruktur.

Wenn Du mit den numerischen Werten etwas anstellen willst, musst Du die noch von Zeichenketten in Zahlen umwandeln und vielleicht aus der ersten Spalte zwei machen, oder Elemente der ersten Spalte in ein Tupel mit Start- und Endwert umwandeln.

Statt einer Liste pro Zeile könnte man vielleicht auch eine Klasse für die Datensätze schreiben.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

BlackJack voll zustimmend, will ich noch mal den Versuch einer Klärung auf einer anderen Ebene, nämlich der Aufgabenstellung aus dem ersten Post machen:
Das Zeilenweise einlesen ist auch nicht das Problem
Gut. Bist Du sicher?
das Problem welches ich im Moment habe ist das die einzelnen Spalten der Datei eben auch getrennt werden müssen.
Geht mit split, wie Dill gezeigt hat. Und wie man die dabei gewonnenen gesplitteten Daten speichert und nicht verliert zeigt mein allererster Code in diesem Thread.
Es müsste also möglich sein z.B. unterschiedliche Listen zu erstellen die die einzelnen Spalten speichern.
Aus einer Spalte im Originalfile eine Liste machen. Der von mir weniger elegant gepostete und von BlackJack verfeinerte Code macht aus der ersten Spalte zwei Listen: Eine mit dem Anfangsbasenpaar und eine mit dem Ende-Basenpaar. Anhand dieses Beispiels kannst Du doch bestimmt für die verbleibenden acht Spalten selbst den Code schreiben, dass daraus auch jeweils Listen werden.
und lese dann aus der liste mit den Locations die zahlen raus
...und das ist schon vorbereitet, weil die zitierte Funktion Dir bereits die Locations als Integer zurückgibt.
müssen keine Listen sein wenn jemand nen besseren Vorschlag hat bin ich sehr dankbar!)
Du kannst alternativ die Daten in der im Code als "zellen" beschriebenen Form behalten und auf jedes Element zugreifen, wie ich es in meinem ersten Post anhand der Liste "a" vorgemacht habe. Kommt darauf an, was Du nachher damit machen willst.
BlackJack hat vorgeschlagen, die Daten in einer Klasse zu hinterlegen.

Soweit wir Dich verstanden haben, sind die Aufgaben gelöst. Ohne eine präzisere und verständlichere Problembeschreibung (nicht: Problemandeutung) wird es also nicht weiter gehen.

Gruß,
Bernhard
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

Also erstmal...

ja ich bin sicher das ich mit dem einlesen kein Problem haben werde da ich schon Module für FastA und andere Formate geschrieben habe.

ich denke mit euren Tipps und dem abschließenden Post werde ich es wohl irgendwie auf die Reihe bekommen die File vernünftig einzulesen.
Falls nicht werd ich mich hier an dieser Stelle einfach nochmal melden.


Grüße

Phill
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

Hallo...

soweit läuft nun alles ich habe nur ein Problem und zwar bekomme ich wenn ich das hier compile:

Code: Alles auswählen

class Fasta(object):

    """Imports a FastA-File to an internal object"""

    

    head = ""

    sequence = ""

    

    def importfasta(self, myfile):

        myfasta = file(myfile, 'r')

        #read the first line (header)

        header = myfasta.readline()
		seqline = myfasta.readline()        
		firstchar = currline[0]

        #is file a fasta file?

        if firstchar != ">":

            print"No Fasta file given"

        else:

        #read the file up to next Header or up to EOF

            while seqline != "" and seqline[0] != ">":

                seqline = myfasta.readline()

                seqline = seqline.strip()

                self.sequence += seqline

            # close the stream

            myfasta.close()

            #get chars to uppercase

            self.sequence = self.sequence.upper()

        genome.setSequence(self.sequence)

diesen Fehler:
phil@tux-user:~/GenomeViewer$ python View.py
Traceback (most recent call last):
File "View.py", line 14, in <module>
from TreeView import TreeView
File "/home/phil/GenomeViewer/TreeView.py", line 3, in <module>
import Imports
File "/home/phil/GenomeViewer/Imports.py", line 23
seqline = myfasta.readline()
^
IndentationError: unexpected indent <----


Ich habe aber keine Ahnung woran es liegt... ich denke doch das alles richtig eingerückt etc ist...



Gruß Phill
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nein, in der importfasta-Methode vermischt du Leerzeichen und Tabs. Zur Einrückung solltest du immer vier Leerzeichen pro Ebene benutzen und ggf. deinen Editor so umstellen, dass er aus einem Tab vier Leerzeichen macht.

Edit: Noch ein paar Anmerkungen:
- etwas weniger Leerzeilen wären nicht schlecht
- sicher, dass "head" und "sequence" Klassenvariablen sein sollen und nicht zu einer Instanz von Fasta gehören?
- Dateien solltest du mit "open" öffnen und nicht mit "file"
- Kommentare wie "get chars to uppercase" kannst du dir sparen. Sie sollen die Befehle nicht noch einmal in Worten beschreiben, sonder was allgemein passiert und Unterstützung beim Verständnis liefern.
- das Kommentar in Zeile 32 solltest du auf die richtige Ebene verschieben.
Das Leben ist wie ein Tennisball.
BlackJack

Ergänzend zu EyDu: Wo kommen `currline` und `genome` her?

Ob eine Zeichenkette mit einem bestimmten Präfix beginnt, würde ich mit der `startswith()`-Methode auf Zeichenketten prüfen.

Wenn es *keine* "fasta"-Datei ist, schliesst Du die Datei nicht wieder.

Aus der ``while``-Schleife würde ich eine ``for``-Schleife machen, die bei entsprechender Bedingung mit ``break`` verlassen wird. Oder man könnte mit den Funktionen aus `itertools` arbeiten. Ungetestet:

Code: Alles auswählen

from itertools import takewhile


def is_not_fasta_header(line):
    return not line.startswith('>')


class Fasta(object):

    def import_fasta(self, filename):
        lines = open(filename, 'r')

        header = myfasta.next()
        if is_not_fasta_header(header):
            raise ValueError('No Fasta filename given')
        
        self.sequence = ''.join(s.strip().upper()
                                for s in takewhile(is_not_fasta_header, lines))
        lines.close()
        # genome.setSequence(self.sequence)
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

hey danke für die Tipps... ich denke so ist der Code schöner und kürzer.
genome ist ein Instanz einer anderen Klasse die Global in dem Modul erstellt wird da nicht nur FastA Datein eingelesen werden müssen.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Habt ihr vielleicht auch mal überlegt für dieses Projekt eine Datenbank zu nutzen? Meiner Meinung nach sprechen folgende Punkte dafür.
  • relative viele Daten
  • Daten bereits in einer Tabellenstruktur vorhanden
  • scheint sich um ein größeres Projekt zu handeln, bei dem SQL später vielleicht einmal noch sehr nützlich sein kann
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

Hey,

ja wir haben überlegt das ganze direkt an die NCBI Datenbank zu koppeln. Bis jetzt ist aber noch nicht raus ob das überhaupt gewünscht ist. Sinnvoll wäre es aber in unseren Augen auch. Die Entscheidung liegt aber nicht bei uns. Falls es aber so kommt darf ich mich dann mal an dich wenden wegen SQL? ;)


gruß


phill
Antworten