Schreiben von 2 Listen in eine Datei

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.
Antworten
Melody
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:22

Hallo an alle,

ich habe 2 Listen, die ich in eine txt-Datei schreiben will.
Die Listen könnten zum Beispiel folgendermaßen aussehen:

Code: Alles auswählen

a=[1, 2, 3]
b=[4, 5, 6]
Der Inhalt der txt-Datei soll dann folgendermaßen aussehen:
1 4
2 5
3 6

Wie man in eine Datei schreibt, verstehe ich, aber alle Versuche den Inhalt von zwei Listen nebeneinander in eine Datei zu schreiben, sind bisher gescheitert, weshalb ich hier diese Frage stelle.
Danke schon mal für eure Hilfe!
BlackJack

@Melody: Du suchst die `zip()`-Funktion beziehungsweise `itertools.izip()`.
Melody
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:22

Was ist der Unterschied zwischen der zip Funktion und der itertools.izip Funktion?

Die zip Funktion habe ich bereits vorher angewendet, aber dann ergibt sich beim Schreiben in die txt-Datei das Problem, dass die Tupel mitreingeschrieben werden. Der Code...

Code: Alles auswählen

a=(1, 2, 3)
b=(4, 5, 6)
c=zip(a,b)
Test=open("Test.txt", "w")
for i in c:
    i=str(i)
    Test.write(i +"\n")
Test.close()
...führt also zu folgendem Inhalt der txt-Datei:
(1, 4)
(2, 5)
(3, 6)

Ich brauche den Inhalt ohne Klammern und Kommas, vielleicht gibt es ja noch eine Möglichkeit die txt-Datei nach dem Schreiben zu verändern?
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Melody hat geschrieben:Was ist der Unterschied zwischen der zip Funktion und der itertools.izip Funktion?
zip liefert eine Liste. izip liefert einen Iterator. Dort werden die Elemente on-the-fly erstellt. Das kommt dem Speicherbedarf und vielleicht auch dem Laufzeitverhalten entgegen, führt aber dazu, dass das Ergebnis nur einmal durchlaufen werden kann.

Code: Alles auswählen

>>> x = ['A', 'B']
>>> y = [1, 2]
>>> data = zip(x, y)
>>> for value in data:
	print value
	
('A', 1)
('B', 2)
>>> for value in data:
	print value
	
('A', 1)
('B', 2)
>>> data = itertools.izip(x, y)
>>> for value in data:
	print value
	
('A', 1)
('B', 2)
>>> for value in data:
	print value
	
>>> 
Melody hat geschrieben:Ich brauche den Inhalt ohne Klammern und Kommas, vielleicht gibt es ja noch eine Möglichkeit die txt-Datei nach dem Schreiben zu verändern?
Die Datei nachträglich zu verändern ist eine unpraktische Lösung. Es wäre besser, die Daten direkt korrekt zu schreiben.

Du solltest dich daher nicht auf die von Python bereitgestellte Repräsentation der Daten verlassen, sondern die Aufbereitung selber vornehmen. Verwende einfach die Einzelwerte.

Code: Alles auswählen

>>> print element
(23, 42)
>>> print element[0], element[1]
23 42
Melody
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:22

Danke für den Tipp, nach diesem Prinzip hat es jetzt funktioniert:

Code: Alles auswählen

Tabelle1=[1, 2, 3]
Tabelle2=[4, 5, 6]

Tabelle3=zip(Tabelle1, Tabelle2)

Tabelle4=[]
for i in Tabelle3:
    for k in range(1):
        a=str(i[0]) + " " + str(i[1])
        Tabelle4.append(a)

Test=open("Test.txt", "w")
for i in Tabelle4:
    i=str(i)
    Test.write(i +"\n")
Test.close()
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Melody,
vergiss am besten, dass es soetwas wie »str« gibt, und dass man Strings mit »+« zusammenstückeln kann. Der bessere Weg ist es, Stringformatierungen (per ».format« oder »%« zu benutzen. Das ist effizienter, besser lesbar und flexibler.
Zum Beispiel:

Code: Alles auswählen

from itertools import izip
Tabelle1=[1, 2, 3]
Tabelle2=[4, 5, 6]

with open("test.text", "w") as output:
    output.writelines("{0:d} {1:.4f}\n".format(a,b) for a,b in izip(Tabelle1, Tabelle2))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Man kann auch das ``csv``-Modul dafür nehmen:

Code: Alles auswählen

import csv
from itertools import izip

Tabelle1=[1, 2, 3]
Tabelle2=[4, 5, 6]

with open("text.csv", "wb") as output:
    csv.writer(output, delimiter=" ").writerows(pair for pair in izip(
                                                        Tabelle1, Tabelle2))
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hyperion: wobei die »for«-Schleife aus rein ästhetischen Gründen Verwendung findet. :P
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sirius3 hat geschrieben:@Hyperion: wobei die »for«-Schleife aus rein ästhetischen Gründen Verwendung findet. :P
Latürnich :oops:

Ich wollte den OP nur nicht verwirren :-D

...

na gut, hier die Korrektur:

Code: Alles auswählen

with open("text.csv", "wb") as output:
    csv.writer(output, delimiter=" ").writerows(izip(Tabelle1, Tabelle2))
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Melody
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:22

Dankeschön für die weiteren Antworten und Tipps :)!
Antworten