Seite 1 von 1

Listen in Datei speichern

Verfasst: Samstag 8. April 2006, 07:51
von lumbes
Hallo!

Nachdem ich jetzt ne Weile in den Foren gesucht, mein Problem aber nicht gefunden habe, hier mein Problem:
Ich habe zwei gleich lange Listen, die ich zu einer neuen Liste verknüpfen moechte. Das funktioniert auch. Wenn ich diese neue Liste in eine Datei schreibe, erhalte ich jedoch folgendes Muster:
100:
200
134:
456
Ich brauche die Daten aber jeweils in einer Zeile, also so:
100: 200
134: 456

Mein Listenausdruck sieht folgendermaßen aus:
['100: \n', '200\n']
Hier der entsprechende code:

Code: Alles auswählen

global summe
fz=file("C:\RiemDaten\DatenRiem\zwischen.txt", "r")
fw=file("C:\RiemDaten\DatenRiem\wohnklein.txt", "r")
regexB=re.compile("(\d+)")
sum = 0
for b in fz.readlines():
    sum += 1
    resultB=regexB.split(b,7) #x1=resultB[1] y1=resultB[3] x2=resultB[5] y2=resultB[7]
    for m in fw.readlines():
        resultC=regexB.split(m,9) #strid=resultC[1] xmin=resultC[3] ymin=resultC[5] xmax=resultC[7] ymax=resultC[9]
        if (((resultB[1] >= resultC[3]) and (resultB[1] < resultC[7])) and ((resultB[3] >= resultC[5]) and (resultB[3] < resultC[9]))):
            fileInA.write((resultC[1])+': '+'\n')
        if (((resultB[5] >= resultC[3]) and (resultB[5] < resultC[7])) and ((resultB[7] >= resultC[5]) and (resultB[7] < resultC[9]))):
            fileInB.write((resultC[1])+'\n')
        fw.seek(0)
summe = sum
fileInA.close()
fileInB.close()

try:
    pfad = "C:\RiemDaten\DatenRiem\Input"
    filenames = os.listdir(pfad)
    iter_list = []

    for fname in filenames:
        iter_list.append(iter(open(pfad+"\\"+fname, "r")))

    for i in xrange(summe):
        zeilex = []
        for iter_f in iter_list:
            zeilex.append(iter_f.next())
        print zeilex
        fileIn.write("".join(zeilex))

except StopIteration:
    print "Ueberlauf"

fileIn.close()
Danke und Gruß
lumbes

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Samstag 8. April 2006, 08:07
von gerold
Hi!

Bitte schließe deinen Code in Code-Tags ein. Dann fällt es uns leichter dir zu helfen.
Siehe Codehighlighting.

mfg
Gerold
:-)

Verfasst: Samstag 8. April 2006, 10:10
von lumbes
Tut mir leid! Hatte zu schnell auf 'abschicken' gedrueckt.

Hier also noch einmal mein Problem:


Nachdem ich jetzt ne Weile in den Foren gesucht, mein Problem aber nicht gefunden habe, hier mein Problem:
Ich habe zwei gleich lange Listen, die ich zu einer neuen Liste verknüpfen moechte. Das funktioniert auch. Wenn ich diese neue Liste in eine Datei schreibe, erhalte ich jedoch folgendes Muster:
100:
200
134:
456
Ich brauche die Daten aber jeweils in einer Zeile, also so:
100: 200
134: 456

Mein Listenausdruck sieht folgendermaßen aus:
['100: \n', '200\n']
Hier der entsprechende code:

Code: Alles auswählen

global summe
fz=file("C:\RiemDaten\DatenRiem\zwischen.txt", "r")
fw=file("C:\RiemDaten\DatenRiem\wohnklein.txt", "r")
regexB=re.compile("(\d+)")
sum = 0
for b in fz.readlines():
    sum += 1
    resultB=regexB.split(b,7) #x1=resultB[1] y1=resultB[3] x2=resultB[5] y2=resultB[7]
    for m in fw.readlines():
        resultC=regexB.split(m,9) #strid=resultC[1] xmin=resultC[3] ymin=resultC[5] xmax=resultC[7] ymax=resultC[9]
        if (((resultB[1] >= resultC[3]) and (resultB[1] < resultC[7])) and ((resultB[3] >= resultC[5]) and (resultB[3] < resultC[9]))):
            fileInA.write((resultC[1])+': '+'\n')
        if (((resultB[5] >= resultC[3]) and (resultB[5] < resultC[7])) and ((resultB[7] >= resultC[5]) and (resultB[7] < resultC[9]))):
            fileInB.write((resultC[1])+'\n')
        fw.seek(0)
summe = sum
fileInA.close()
fileInB.close()

try:
    pfad = "C:\RiemDaten\DatenRiem\Input"
    filenames = os.listdir(pfad)
    iter_list = []

    for fname in filenames:
        iter_list.append(iter(open(pfad+"\\"+fname, "r")))

    for i in xrange(summe):
        zeilex = []
        for iter_f in iter_list:
            zeilex.append(iter_f.next())
        print zeilex
        fileIn.write("".join(zeilex))

except StopIteration:
    print "Ueberlauf"

fileIn.close()
Ich habe auch schon versucht, in der Zeile:

Code: Alles auswählen

fileInA.write((resultC[1])+': '+'\n')
'\n' wegzulassen, aber dann erhalte ich eine einzige große Liste und nicht eine, die mir die Werte zeilenweise einliest.

Freue mich ueber jeden Vorschlag! Danke
Lumbes

edit (jens): BBCode in diesem Beitrag aktiviert!

Verfasst: Samstag 8. April 2006, 10:47
von Python 47
Sieht so aus, als hättest du keine BBCodes in deinem Profil aktiviert!Aktiviere diese und setzt deinen Code dann nochmal in Python Tags!

Verfasst: Samstag 8. April 2006, 23:44
von BlackJack
lumbes hat geschrieben:Nachdem ich jetzt ne Weile in den Foren gesucht, mein Problem aber nicht gefunden habe, hier mein Problem:
Ich habe zwei gleich lange Listen, die ich zu einer neuen Liste verknüpfen moechte. Das funktioniert auch. Wenn ich diese neue Liste in eine Datei schreibe, erhalte ich jedoch folgendes Muster:
100:
200
134:
456
Ich brauche die Daten aber jeweils in einer Zeile, also so:
100: 200
134: 456

Mein Listenausdruck sieht folgendermaßen aus:
['100: \n', '200\n']
Hier der entsprechende code:

Code: Alles auswählen

global summe
fz=file("C:\RiemDaten\DatenRiem\zwischen.txt", "r")
fw=file("C:\RiemDaten\DatenRiem\wohnklein.txt", "r")
regexB=re.compile("(\d+)")
sum = 0
for b in fz.readlines():
    sum += 1
    resultB=regexB.split(b,7) #x1=resultB[1] y1=resultB[3] x2=resultB[5] y2=resultB[7]
    for m in fw.readlines():
        resultC=regexB.split(m,9) #strid=resultC[1] xmin=resultC[3] ymin=resultC[5] xmax=resultC[7] ymax=resultC[9]
        if (((resultB[1] >= resultC[3]) and (resultB[1] < resultC[7])) and ((resultB[3] >= resultC[5]) and (resultB[3] < resultC[9]))):
            fileInA.write((resultC[1])+': '+'\n')
        if (((resultB[5] >= resultC[3]) and (resultB[5] < resultC[7])) and ((resultB[7] >= resultC[5]) and (resultB[7] < resultC[9]))):
            fileInB.write((resultC[1])+'\n')
        fw.seek(0)
summe = sum
fileInA.close()
fileInB.close()
Wo kommen denn `fileInA` und `fileInB` her? `summe` wird der Wert von `sum` zugewiesen, das ist also einfach nur ein umbenennen. Das mitzählen ist aber nicht wirklich notwendig.

Dann weiss ich nicht ob Deine Vergleiche so funktionieren wie Du das möchtest, Du vergleichst nämlich Zeichenketten auf kleiner/grösser und da ist zum Beispiel '10' kleiner als '9':

Code: Alles auswählen

In [26]:10 > 9
Out[26]:True

In [27]:'10' > '9'
Out[27]:False
Das `fw.seek(0)` ist zu weit eingerückt, das muss nicht bei jedem Durchlauf der inneren Schleife passieren.

Code: Alles auswählen

try:
    pfad = "C:\RiemDaten\DatenRiem\Input"
    filenames = os.listdir(pfad)
    iter_list = []

    for fname in filenames:
        iter_list.append(iter(open(pfad+"\"+fname, "r")))
Das verbinden von Pfaden macht man besser mit `os.path.join()`, dann funktioniert das auch auf anderen Plattformen.

Code: Alles auswählen

    for i in xrange(summe):
        zeilex = []
        for iter_f in iter_list:
            zeilex.append(iter_f.next())
        print zeilex
        fileIn.write("".join(zeilex))

except StopIteration:
    print "Ueberlauf"

fileIn.close()
Du musst die Zeilenenden nach dem einlesen entfernen. Zumindest von allen Zeilen ausser der aus der letzten Datei. Sonst hast Du beim Zusammenfügen diese Zeilenenden in der Zeile, und damit sind's dann mehrere. Die `rstrip()` auf Zeichenketten mit einem Zeilenende als Argument sollte das gewünschte tun.

Die ``for``-Schleife mit dem `i` sollte man weglassen können -- das Abfangen der `StopIteration` sollte ausreichend sein.

Verfasst: Montag 10. April 2006, 07:59
von lumbes
Hallo BlackJack,

Deine Fragen bzw. Anmerkungen haben mich auf neue Ideen gebracht. Ich bin die Sache, glaube ich, einfach zu kompliziert angegangen. Die beiden files 'fileInA' und 'fileInB' dienten mir zum Zwischenspeichern. Ich habe jetzt stattdessen Listen verwendet.
Die Variable 'sum' diente mir zum Schleifen zählen, damit ich in der try-except Anweisung keinen Ueberlauf erhalte.
Danke für den Hinweis mit dem 'fw.seek(0)', habe ich geaendert.

Vielen Dank fuer Deine Antwort, sie hat mir sehr geholfen!

Gruß
lumbes