Listen in Datei speichern

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.
lumbes
User
Beiträge: 5
Registriert: Samstag 1. April 2006, 08:41

Listen in Datei speichern

Beitragvon lumbes » Samstag 8. April 2006, 07:51

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 8. April 2006, 08:07

Hi!

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

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lumbes
User
Beiträge: 5
Registriert: Samstag 1. April 2006, 08:41

Beitragvon lumbes » Samstag 8. April 2006, 10:10

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!
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Beitragvon Python 47 » Samstag 8. April 2006, 10: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!
mfg

Thomas :-)
BlackJack

Beitragvon BlackJack » Samstag 8. April 2006, 23:44

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.
lumbes
User
Beiträge: 5
Registriert: Samstag 1. April 2006, 08:41

Beitragvon lumbes » Montag 10. April 2006, 07:59

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

Wer ist online?

Mitglieder in diesem Forum: Google [Bot], mollyman