Seite 1 von 1

Kurze Frage: Mehrdimensionales Array

Verfasst: Mittwoch 30. September 2009, 11:52
von may24
Hi zusammen,

gibt es die Möglichkeit in Python ein leeres zweidimmensionales Array zu definieren.

Mein Problem ist folgendes: Ich durchsuche ein Unterverzeichnis mit diversen Dateien. Aus jeder Datei lese ich verschiedene Parameter aus.
Ich brauche ein zweidimmensionales Array das mir für jede Datei einen Parametersatz speichert. Soweit kein Problem, nur beim ersten Durchlauf ist das Array noch ein Eindimmensionales, erst beim zweiten Durchlauf wird ein zweidimmensionales draus.

Wie teile ich also Python mit das ich nur eine zweidimmensionales Array haben will

Verfasst: Mittwoch 30. September 2009, 12:20
von cofi
Sofern du nicht `array.Array` benutzt, hast du Listen. Da die sehr selten sind nehme ich an, dass du letzteres meinst.

Ich sehe das Problem nicht wirklich. Warum fuegst du deine inneren Listen nicht einfach ein, wenn sie entstehen? Vllt solltest du mal deinen Code zeigen.
Aus deiner Problembeschreibung wuerde ich auch eher ein Dictionary von Listen nehmen.

Verfasst: Mittwoch 30. September 2009, 13:06
von sma
Siehe auch http://www.python-forum.de/topic-20395.html

Aber das Problem klingt, als ob man sich da um eine Klasse oder wenigstens ein "named tuple" drückt. Ich würde doch die Informationen über die Dateien irgendwie besser strukturieren als in eine Liste einzufügen und wenn man besser strukturiert, braucht man nur noch eine Liste mit diesen Strukturen.

Stefan

Verfasst: Mittwoch 30. September 2009, 13:15
von may24
@cofi jaaaa, die inneren Listen anfügen (append) das war die Lösung. Eine Zeile geändert und schon läuft alles !

Habe dafür aber jetzt ein neues Probelm. Ich habe bis jetzt mit seek und read gearbeitet um an bestimmten Stellen Information auszulesen.
Seek arbeitet aber mit absoluter Byte Position. D.h. wenn ich den Zeiger an die angegebene Stelle bewege liest er ab genau dieser. Soweit ok, wenn die Datenfelder immer gleich groß (Länge) sind. Nun sind sie es aber nicht.
Da eine Datei bis weilen recht lang werden kann und die benötigten Info's eh nur im Header sind - gibt es die Möglichkeit explizit nur die dritte oder die 18'te Zeile auszulesen und dann zu parsen (mit re...)

Ich will halt nicht mit read oder readline das komplette Dokument laden wenn ich eh nur drei Parameter draus brauche.

Verfasst: Mittwoch 30. September 2009, 13:23
von sma
may24 hat geschrieben:Ich will halt nicht mit read oder readline das komplette Dokument laden wenn ich eh nur drei Parameter draus brauche.
Geht nicht. Woher soll das System wissen, was du unter eine Zeile verstehst? Du musst schon jedes Zeichen lesen, entscheiden ob das Zeilenende oder Teil eines Zeilenendes ist (das muss ja nicht nur durch ein Zeichen definiert sein), dann die Zeilen zählen und so wissen, was die 18. Zeile ist.

Stefan

Verfasst: Mittwoch 30. September 2009, 14:00
von may24
sma hat geschrieben:
may24 hat geschrieben:Ich will halt nicht mit read oder readline das komplette Dokument laden wenn ich eh nur drei Parameter draus brauche.
Geht nicht. Woher soll das System wissen, was du unter eine Zeile verstehst? Du musst schon jedes Zeichen lesen, entscheiden ob das Zeilenende oder Teil eines Zeilenendes ist (das muss ja nicht nur durch ein Zeichen definiert sein), dann die Zeilen zählen und so wissen, was die 18. Zeile ist.

Stefan
...hmmm, wie macht es den grep ?

Verfasst: Mittwoch 30. September 2009, 14:05
von snafu
Du kannst mit [mod]linecache[/mod] auf eine bestimmte Zeilennummer einer Datei zugreifen. Intern wird aber auch da der komplette Datei-Inhalt in den Speicher geladen. Wie schon gesagt wurde: Es geht halt nicht anders.

EDIT: Doch, eine Möglichkeit gäb's. Man liest die Datei zeichenweise und bei jedem Zeilenumbruch springt der Zähler um eins höher. Wenn du dann Zeile 13 willst, werden soviele Zeichen gelesen bis der Zähler auf 13 ist und diese Zeile wird dann ausgegeben. Ich weiß allerdings nicht, wie effizient so ein zeichenweises Lesen in Python wäre.

Verfasst: Mittwoch 30. September 2009, 14:20
von may24
snafu hat geschrieben:Du kannst mit [mod]linecache[/mod] auf eine bestimmte Zeilennummer einer Datei zugreifen. Intern wird aber auch da der komplette Datei-Inhalt in den Speicher geladen. Wie schon gesagt wurde: Es geht halt nicht anders.
Schon nicht schlecht, aber kann ich nicht einfach einen Bestimmten Bereich - sagen wir mal die ersten 1024 Byte - in diesen Cache Speicher laden ?

Verfasst: Mittwoch 30. September 2009, 14:54
von HWK
snafu hat geschrieben:Doch, eine Möglichkeit gäb's. Man liest die Datei zeichenweise und bei jedem Zeilenumbruch springt der Zähler um eins höher. Wenn du dann Zeile 13 willst, werden soviele Zeichen gelesen bis der Zähler auf 13 ist und diese Zeile wird dann ausgegeben. Ich weiß allerdings nicht, wie effizient so ein zeichenweises Lesen in Python wäre.
Warum dann nicht einfach

Code: Alles auswählen

with open(my_file) as infile:
    for i, line in enumerate(infile):
        if i == 3:
            do1(line)
        elif i == 18:
            do2(line)
MfG
HWK

Verfasst: Mittwoch 30. September 2009, 15:06
von snafu
may24 hat geschrieben:Schon nicht schlecht, aber kann ich nicht einfach einen Bestimmten Bereich - sagen wir mal die ersten 1024 Byte - in diesen Cache Speicher laden ?
Du solltest dich mal entscheiden, was du fragen willst. ;)

Ja, das geht:

Code: Alles auswählen

first_kb = my_file.read(1024)

Verfasst: Mittwoch 30. September 2009, 15:17
von snafu
Aber HWK hat ja schon eine simple Lösung vorgeschlagen:

Code: Alles auswählen

def get_line(stream, lineno):
    wanted = lineno - 1
    for i, line in enumerate(stream):
        if i == wanted:
            return line

with open('test.py') as testfile:
    get_line(testfile, 5)
...sofern sich die Iteration über Dateiobjekte so verhält, dass tatsächlich immer nur eine Zeile eingelesen wird, dann sollte sich das mit der Bytebegrenzung damit erübrigt haben.