Seite 1 von 1

Zwei Dateien zu einer machen

Verfasst: Mittwoch 11. Juli 2007, 12:58
von silky vanilla
Ich habe ein wahrscheinlich sehr triviales Problem.

Ich habe zwei Dateien, die aus Spalten bestehen. Nun moechte ich aus Datei_1 die ersten 3 Spalten in eine neue Datei (Datei_neu) schreiben. Die vierte Spalte derDatei_neu soll die 4. Spalte der Datei_2 sein.

Code: Alles auswählen

inp = open('Datei_1')
for line in inp.readlines():
     column = line.split()
inp2 = open('Datei_2')
for line in inp.readlines():
     column2 = line.split()
out = open('Datei_new','w')
out_line = '%s\t%s\t%s\t%s\n' %(column[0], column[1], column[2], column2[3])
out.write(out_line)

inp.close()
inp2.close()
out.close()
So funktioniert es leider nicht.

Eine Fehlermeldung ist, dass data2 nicht definiert waere.

Auch gibt es mir nicht alle Werte aus, sondern nur die erste Zeile.

Hat jemand eine Idee, kann mir jemand weiter helfen???

Vielen Dank schon mal.

Verfasst: Mittwoch 11. Juli 2007, 13:14
von HarryH
Hallo silky vanilla,

Ich würde folgendermaßen vorgehen:

Öffne 'Datei 1'
Öffne 'Datei 2'
Öffne 'Datei Neu'

Dann iteriere über 'Datei 1' und 'Datei 2' gleichzeitig.
Innerhalb der Schleife kannst du dann jeweils beide Zeilen beliebig zu einer neuen Zeile zusammenfügen und gleich in 'Datei Neu' schreiben.

Falls 'Datei 1' und 'Datei 2' unterschiedlich viele Zeilen haben, mußte du dir noch überlegen, was du mit den verbliebenen Zeilen machst.

Danach schließt du alle drei Dateien.

Verfasst: Mittwoch 11. Juli 2007, 13:32
von silky vanilla
Kann ich nicht nur ueber Listen iterieren?

Muss ich dann die Dateien in Listen einlesen bevor ich darueber iteriere?

Verfasst: Mittwoch 11. Juli 2007, 13:52
von HarryH
Hallo,

Zum Beispiel so:

Code: Alles auswählen

f1 = file("datei1", "rb")
f2 = file("datei2", "rb")
fnew = file("dateiNew", "wb")

for line1, line2 in zip(f1, f2):
    cols1 = line1.split()
    cols2 = line2.split()
    newline = "%s\t%s\t%s\t%s\n" % (cols1[0], cols1[1], cols1[2], cols2[3])
    fnew.write(newline)

f1.close()
f2.close()
fnew.close()
Das Beispiel gilt für gleich lange Dateien. Sind die Dateien verschieden lang, so wird nur bis zur letzen Zeile der kurzen Datei iteriert. Der restliche Teil der längeren Datei wird ignoriert.

Verfasst: Mittwoch 11. Juli 2007, 14:04
von silky vanilla
Wenn ich das so mache, wie von dir vorgeschlagen kommt folgende Fehlermeldung

Code: Alles auswählen

Traceback (most recent call last):
File "/home/cellnet/claudiak/bei/18.561.296 random interactions/100 50 1000/make_evidence_from_LLS.py", line 8, in <module>
newline = '%s\t%s\t%s\t%s\n' % (cols1[0], cols1[1], cols1[2], cols2[3])
TypeError: 'builtin_function_or_method' object is unsubscriptable
:?:

Verfasst: Mittwoch 11. Juli 2007, 14:16
von HarryH
Hallo,

Also bei mir geht es.
Zeig doch mal deinen vollständigen Code.

Verfasst: Mittwoch 11. Juli 2007, 14:20
von silky vanilla

Code: Alles auswählen

inp = open('Ewing_Score nicht log trans.tab')
inp2 = open('Ewing_Score nicht log trans.LLS')
out = open('new_evidence.tab','w')

for line1, line2 in zip(inp, inp2):
    cols1 = line1.split()
    cols2 = line2.split
    newline = "%s\t%s\t%s\t%s\n" % (cols1[0], cols1[1], cols1[2], cols2[3])
    out.write(newline)

inp.close()
inp2.close()
out.close()

Verfasst: Mittwoch 11. Juli 2007, 14:22
von birkenfeld
Na siehst du, du hast vergessen, das zweite `split` aufzurufen... die Klammern machen einen Unterschied!

Verfasst: Mittwoch 11. Juli 2007, 14:24
von birkenfeld
Ach ja: hier bietet sich itertools.izip() an, um nicht (wie zip() das macht) beide Dateien auf einmal einzulesen.

Verfasst: Mittwoch 11. Juli 2007, 14:26
von HarryH
birkenfeld hat geschrieben:Ach ja: hier bietet sich itertools.izip() an, um nicht (wie zip() das macht) beide Dateien auf einmal einzulesen.
Ließt die zip()-funktion die ganze Datei auf einmal ein? Aha!
Gut das ich das weiß! :o

Verfasst: Mittwoch 11. Juli 2007, 14:40
von Zap
Nein zip macht aus 2 Listen (oder mehreren) eine Liste von 2er Tuple.

Was ich wohl noch anmerken möchte ist das dabei nur die minmallänge
der Listen (oder wie hier Anzahl der Zeilen) als Grundstein genommen wird.

Code: Alles auswählen

>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9]
>>> zip(a,b)
[(1, 6), (2, 7), (3, 8), (4, 9)]
Die letzte Position von Liste a wird hierbei unter den Tepich gekährt.

Verfasst: Mittwoch 11. Juli 2007, 14:48
von silky vanilla
Dann hab ich gleich noch eine Frage.

Wenn ich eine Spalte aus einer Datei als x-Werte nehme und eine Spalte aus einer anderen Datei als y-Werte nehme und diese grafisch ausgeben moechte, ist das nur moeglich wenn ich "matplotlib" installiert habe, oder gibt es da noch eine andere Moeglichkeit

Verfasst: Mittwoch 11. Juli 2007, 16:14
von BlackJack
@Zap: zip() macht aus zwei oder mehr "iterables" eine Liste mit entsprechenden Tupeln. Das können auch Dateien sein. Und die werden auf einen Schlag komplett eingelesen weil `zip()` die Ergebnisliste komplett erstellt, während `itertools.izip()` die einzelnen Elemente erst bei "Abruf" erstellt und so die Datei(en) erst nach und nach liest.

Verfasst: Mittwoch 11. Juli 2007, 16:20
von Zap
Alles klar :o
Ich hatte nur das Gefühl das silky vanilla in zip eine Methode sieht mit der man Dateien einliest.
Ist im dem Zusammenhang richtig, wollte eigentlich nur drauf hinweisen das zip jetzt nicht "die" Lösung ist um eine Datei ganz enzulesen.

Deine Beschreibung von zip ist natürlich vollkommen richtig ;)

Verfasst: Mittwoch 11. Juli 2007, 16:33
von silky vanilla
hatte das schon so verstanden wie es gemeint war, danke

aber hat denn niemnd ein Antwort auf meine letzte Frage?

Verfasst: Mittwoch 11. Juli 2007, 17:45
von Leonidas
silky vanilla hat geschrieben:Wenn ich eine Spalte aus einer Datei als x-Werte nehme und eine Spalte aus einer anderen Datei als y-Werte nehme und diese grafisch ausgeben moechte, ist das nur moeglich wenn ich "matplotlib" installiert habe, oder gibt es da noch eine andere Moeglichkeit
Kannst auch gnuplot nehmen. Oder etwas selberschreiben.