Zwei Dateien zu einer machen

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.
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 11. Juli 2007, 12:58

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.
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Mittwoch 11. Juli 2007, 13:14

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.
Gruß, Harry
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 11. Juli 2007, 13:32

Kann ich nicht nur ueber Listen iterieren?

Muss ich dann die Dateien in Listen einlesen bevor ich darueber iteriere?
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Mittwoch 11. Juli 2007, 13:52

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.
Gruß, Harry
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 11. Juli 2007, 14:04

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
:?:
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Mittwoch 11. Juli 2007, 14:16

Hallo,

Also bei mir geht es.
Zeig doch mal deinen vollständigen Code.
Gruß, Harry
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 11. Juli 2007, 14:20

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()
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 11. Juli 2007, 14:22

Na siehst du, du hast vergessen, das zweite `split` aufzurufen... die Klammern machen einen Unterschied!
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 11. Juli 2007, 14:24

Ach ja: hier bietet sich itertools.izip() an, um nicht (wie zip() das macht) beide Dateien auf einmal einzulesen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Mittwoch 11. Juli 2007, 14:26

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
Gruß, Harry
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Mittwoch 11. Juli 2007, 14:40

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.
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 11. Juli 2007, 14:48

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
BlackJack

Mittwoch 11. Juli 2007, 16:14

@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.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Mittwoch 11. Juli 2007, 16:20

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 ;)
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 11. Juli 2007, 16:33

hatte das schon so verstanden wie es gemeint war, danke

aber hat denn niemnd ein Antwort auf meine letzte Frage?
Antworten