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
Kurze Frage: Mehrdimensionales Array
- 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.
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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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
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
@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.
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.
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.may24 hat geschrieben:Ich will halt nicht mit read oder readline das komplette Dokument laden wenn ich eh nur drei Parameter draus brauche.
Stefan
...hmmm, wie macht es den grep ?sma hat geschrieben: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.may24 hat geschrieben:Ich will halt nicht mit read oder readline das komplette Dokument laden wenn ich eh nur drei Parameter draus brauche.
Stefan
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.
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.
Schon nicht schlecht, aber kann ich nicht einfach einen Bestimmten Bereich - sagen wir mal die ersten 1024 Byte - in diesen Cache Speicher laden ?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.
Warum dann nicht einfachsnafu 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.
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)
HWK
Du solltest dich mal entscheiden, was du fragen willst.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 ?
Ja, das geht:
Code: Alles auswählen
first_kb = my_file.read(1024)
Aber HWK hat ja schon eine simple Lösung vorgeschlagen:
...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.
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)