zeile für zeile in dic

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.
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

zeile für zeile in dic

Beitragvon pr0stAta » Freitag 22. Oktober 2004, 12:16

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 22. Oktober 2004, 12:34

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()
Zuletzt geändert von Milan am Freitag 22. Oktober 2004, 17:57, insgesamt 1-mal geändert.
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Beitragvon Redprince » Freitag 22. Oktober 2004, 12:34

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)]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 22. Oktober 2004, 12:49

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
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 22. Oktober 2004, 14:23

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

Code: Alles auswählen

#!/usr/bin/env python
import this
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Beitragvon pr0stAta » Montag 25. Oktober 2004, 08:13

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Montag 25. Oktober 2004, 18:01

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
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 25. Oktober 2004, 18:20

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

Code: Alles auswählen

#!/usr/bin/env python
import this
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Beitragvon pr0stAta » Dienstag 26. Oktober 2004, 08:42

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 :>

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder