Kurze Frage: Mehrdimensionales Array

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.
Antworten
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

@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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

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 ?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

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 ?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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