Seite 1 von 1

zeile für zeile in dic

Verfasst: Freitag 22. Oktober 2004, 12:16
von pr0stAta
Ok, der Titel sagt nicht alles, sonst wäre es wohl etwas einfacher.
Folgendes Problem kann ich einfach nicht lösen, wobei die passende txt
datei so aussieht:
Dateiname1.xxx
DateipfadzuDatei1
Dateiname2.xxx
DateipfadzuDatei2
..

So, nun schaffe ich es einfach nicht, dieses in ein Dictionary zu bekommen.
Das dic sollte möglichst so aussehen:
dic = {'dateiname1.xxx':'dateipfadzuDatei1', 'dateiname2':'dateipfadzuDatei2' }
da ich es danach auslesen möchte, braucht es dieses format. kann mir einer weiterhelfen und nen tip geben?
mfg prosta

Verfasst: Freitag 22. Oktober 2004, 12:34
von Milan
Hi. Wo liegt das Problem?

Code: Alles auswählen

f=file("dateiname","U")
lineiter=iter(f)
d={}
while True:
    try:
        d[lineiter.next().replace("\n","")]=lineiter.next().replace("\n","")
    except StopIteration:
        break
f.close()

Verfasst: Freitag 22. Oktober 2004, 12:34
von Redprince
Moinsen...

Code: Alles auswählen

data = readlines()
t = {}
for i in range(len(data)):
    if((i + 1) % 2 != 0):
        t[data[i]] = data[(i + 1)]

Verfasst: Freitag 22. Oktober 2004, 12:49
von Milan
Redprince hat geschrieben:Moinsen...

Code: Alles auswählen

data = readlines()
t = {}
for i in range(len(data)):
    if((i + 1) % 2 != 0):
        t[data[i]] = data[(i + 1)]
Hi. Wenn man schon alles in den Speicher laden will... du musst noch die Zeilenumsprünge abtrennen und statt range würde ich lieber (wieder aus Speicher, vor allem aber Geschwindigkeitsgründen) xrange nehmen und die Schrittweite auf 2 setzen. Dann spaarst du das if und bist noch ein klein wenig schneller.

mfg Milan

Verfasst: Freitag 22. Oktober 2004, 14:23
von Dookie
Hi pr0stAta,

Du könntest auch einen eigenen Iterator für Paare aus einem Iterable machen:

Code: Alles auswählen

import string

def pairs(iterable, fa=lambda a: a, fb=lambda b: b):
    """ fa and fb are optional functions to modify the items of the pairs """
    it = iter(iterable)
    while True:
        yield fa(it.next()), fb(it.next())


f = file("datei.txt", "r")
data = dict(pairs(f, string.rstrip, string.rstrip))
f.close()
Gruß

Dookie

Verfasst: Montag 25. Oktober 2004, 08:13
von pr0stAta
erstmal danke an alle :)
die verständlichste für mich war redprince version, aber da fehlte
ja nen teil wie milan schon schrieb.
dookies, deins is mir irgendwie zu hoch :>
ich belasse es also bei milans vorschlag

Verfasst: Montag 25. Oktober 2004, 18:01
von Milan
Hi, ist das ein Grund etwas nicht einzusetzen, weil man es nicht versteht? dafür ist doch das Forum hier da, um sich was erklären zu lassen. Also mal ausgegangen von Redprince seiner Variante (verbessert):

Code: Alles auswählen

f = file("datei.txt", "r")
data = f.readlines()
f.close()
t = {}
for i in xrange(0,len(data),2):
    t[data[i].rstrip()] = data[(i + 1)].rstrip()
    #ich mag kein rstrip - könnte Leerzeichen am Zeilenende entfehrnen, aber Dookie nutzt es
Nun Dookie seine Variante:

Code: Alles auswählen

def pairs(iterable, fa=lambda a: a, fb=lambda b: b):
    it = iter(iterable)
    while True:
        yield fa(it.next()), fb(it.next())
f = file("datei.txt", "r")
t={}
for key,value in pairs(f, str.rstrip, str.rstrip):
    t[key]=t[value]
f.close()
Die for Schleife ist in Dookies Fall durch das dict ersetzt, nur zum Vergleich... wo ist der Unterschied? Oben wird alles gleich auf einmal geladen, mittels readlines in eine Liste. Hier geht Dookie genauso vor wie ich, nur dass er es in einer Funktion machen lässt - es werden immer paarweise zwei Zeilen ausgelesen und der Zeilenumsprung abgetrennt. Das ganze nennt sich Iterator (das pairs(...)) und kann so einfach die for Schleife passieren. Verständlicher?

mfg Milan

Verfasst: Montag 25. Oktober 2004, 18:20
von Dookie
Hi milan,

du kannst auch *.rstrip("\r\n") verwenden, so werden nur Zeilenumbrüche am Zeilenende entfernt.
Der generator pairs stammt aus einem Programm von mir, ist einfach universell zu verwenden, um Listen und ähnliches paarweise Auszulesen.


Gruß

Dookie

Verfasst: Dienstag 26. Oktober 2004, 08:42
von pr0stAta
jo danke für die erklärung nu isses für mich verständlich :>
Hi, ist das ein Grund etwas nicht einzusetzen, weil man es nicht versteht?
meiner meinung - ja , denn ich möchte ja ein programm haben was
ich verstehe und zur not jmd anders erklären könnte. wenn ich code einsetze den ich selber nicht verstehe, passt das meiner meinung nach irgendwie
nicht :>