Seite 1 von 1
Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 10:55
von vivienj
Hallo,
ich habe ein Problem mit dem Zusammenfügen von zwei Textdokumenten, die Tabellen beinhalten. Ich habe mehrere Programme geschrieben, deren Ergebnisse leider immer nicht ganz das Ziel erfüllen.
Die eine Tabelle sieht wie folgt aus:
die zweite
Also Ergebnis hätte ich gerne
Code: Alles auswählen
Laenge Hoehe Breite Stress
1 10 100 12
2 20 200 22
....
Das folgende Programm gibt folgende Tabelle aus:
Code: Alles auswählen
Laenge Hoehe Breite
Stress
1 10 100
12
2 20 200
22
.....
Code: Alles auswählen
NewData=open("C:\Users\Vivien\Desktop\stress.txt","r")
Para=open("C:\Users\Vivien\Desktop\design.txt","r")
WerteTabelle=open("C:\Users\Vivien\Desktop\WerteTabelle_1.txt","w")
array=[]
design=[]
num=0
for linePara in Para:
design.append(linePara)
#design.insert(0, linePara)
print"loop2"
for line in NewData:
array.append(line)
#array.insert(0, line)
print"loop3"
str='\t'
linefill=(linePara,line)
linecomp=str.join(linefill)
WerteTabelle.write(linecomp);
print"Tabelle",WerteTabelle
break;
das nächste gibt mir:
Da habe ich den zweiten loop nicht richtig gesetzt, aber wenn ich ihn verschiebe kommt halt das obere Ergebnis raus
Code: Alles auswählen
NewData=open("C:\Users\Vivien\Desktop\stress.txt","r")
Para=open("C:\Users\Vivien\Desktop\design.txt","r")
WerteTabelle=open("C:\Users\Vivien\Desktop\WerteTabelle_.txt","w")
array=[]
design=[]
num=0
for line in NewData:
array.append(line)
print"loop1"
if num>0:
WerteTabelle.write(line)
# WerteTabelle.write(lineDat)
num=num+1
else:
print "OK";
for linePara in Para:
design.insert(0, linePara)
print"loop2"
for line in NewData:
array.insert(0, line)
print"loop3"
str='\t'
linefill=(linePara,line)
linecomp=str.join(linefill)
WerteTabelle.write(linecomp);
print"Tabelle",WerteTabelle
break;
Hat einer von euch eine Idee? Ich wäre euch sehr dankbar.
Viele Grüße
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 11:04
von mutetella
Kannst Du Deine Beispiele bitte mal mit codetags versehen. Einfach am Anfang ein [*python] und am Ende ein [/*python] natürlich ohne den Sternchen! Kann man dann sehr viel einfacher lesen...
mutetella
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 11:10
von /me
Wenn die Dateien klein genug sind, dass sie in den Hauptspeicher passen, dann kann man sie direkt komplett einlesen. Anschließend kombiniert man dann die Zeilen mit zip und verarbeitet sie weiter.
Code: Alles auswählen
with open('file1.txt') as fp1, open('file2.txt') as fp2:
text1 = fp1.readlines()
text2 = fp2.readlines()
for data in zip(text1, text2):
print(data)
print('{} {}'.format(data[0].strip(), data[1].strip()))
Die print-Ausgaben sind jetzt nur zur Verdeutlichung. Dort müsste dann die Ausgabe in die Zieldatei erfolgen. An der aktuellen Ausgabe kannst du erkennen welche Daten du da jetzt vorliegen hast.
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 12:12
von vivienj
Danke für den Tip, hier nochmal als Python-Tags
Code: Alles auswählen
NewData=open("C:\Users\Vivien\Desktop\stress.txt","r")
Para=open("C:\Users\Vivien\Desktop\design.txt","r")
WerteTabelle=open("C:\Users\Vivien\Desktop\WerteTabelle_1.txt","w")
array=[]
design=[]
num=0
for linePara in Para:
design.insert(0, linePara)
print"loop2"
for line in NewData:
array.insert(0, line)
print"loop3"
str='\t'
linefill=(linePara,line)
linecomp=str.join(linefill)
WerteTabelle.write(linecomp);
print"Tabelle",WerteTabelle
break;
Code: Alles auswählen
NewData=open("C:\Users\Vivien\Desktop\stress.txt","r")
Para=open("C:\Users\Vivien\Desktop\design.txt","r")
WerteTabelle=open("C:\Users\Vivien\Desktop\WerteTabelle_.txt","w")
array=[]
design=[]
num=0
for line in NewData:
array.append(line)
print"loop1"
if num>0:
WerteTabelle.write(line)
# WerteTabelle.write(lineDat)
num=num+1
else:
print "OK";
for linePara in Para:
design.insert(0, linePara)
print"loop2"
for line in NewData:
array.insert(0, line)
print"loop3"
str='\t'
linefill=(linePara,line)
linecomp=str.join(linefill)
WerteTabelle.write(linecomp);
print"Tabelle",WerteTabelle
break;
Derzeit ist die Tabelle eher kurz, ich habe ein Programm geschrieben, dass CATIA und Abaqus (Konstruktion mit Berechnung) verknüpft, damit parametrisierte BAuteile berechnet werden. Da ich derzeit nur mit der Studentenversion von Abaqus arbeite macht er mir leider nicht mehr als 15 Berechnungen, aber zukünftig soll eine normale Lizenz vorliegen und dann können die Datensätze erheblich länger werden.
Ich probier das mit dem zip mal aus, aber ich glaube auf lange Sicht ist es leider nicht die Lösung meines Problems.
Vielen Dank schon mal!
Grüße
Vivien
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 12:24
von vivienj
@/me
Leider wirft er mir so alles in einer Zeile aus, ich habe versuchte ein "\n" einzufügen, aber dann fügt er dieses ein und läßt die zweite Tabelle weg
Code: Alles auswählen
WerteTabelle=open("C:\Users\Vivien\Desktop\WerteTabelle_1.txt","w")
with open('C:\Users\Vivien\Desktop\stress.txt') as fp1, open('C:\Users\Vivien\Desktop\design.txt') as fp2:
text1 = fp2.readlines()
text2 = fp1.readlines()
for data in zip(text1, text2):
print(data)
print('{} {}'.format(data[0].strip(), data[1].strip()))
WerteTabelle.write('{} {}'.format(data[0].strip(),"\n", data[1].strip()))
Grüße
Vivien
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 12:45
von sparrow
1. Backslashes in Zeichenketten sind Escape-Zeichen. Entweder musst du sie mit einem führenden \ maskieren oder die Zeichenkette als "rohe" und somit unintpretierte Zeichenkette kennzeichnen: indem du ein r davor schreibst.
Falsch: "c:\hallo.txt"
Richtig: "c:\\hallo.txt"
Richtig: r"c:\hallo.txt"
2. \n (übrigens: ein Backslash als Escape-Zeichen. Was würde wohl passieren wenn ein \n in deinem Pfad stände?) fügt einen Zeilenumbruch in eine Textdatei ein. Wenn du den zwischen zwei Werte setzt stehen die logischerweise nicht mehr in einer Zeile.
Du solltest dir außerdem anschauen was genau .format() tut. Die {} in der Zeichenkette sind Platzhalter, die durch Variablen gefüllt werden. Da das \n aber in jeder Zeile vorkommen soll, muss es nicht in den Bereich mit den Werten für den Platzhalter, sondern direkt in die Zeichenkette.
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 13:05
von /me
vivienj hat geschrieben:Code: Alles auswählen
WerteTabelle.write('{} {}'.format(data[0].strip(),"\n", data[1].strip()))
Das sollte wie folgt aussehen:
Code: Alles auswählen
WerteTabelle.write('{} {}\n'.format(data[0].strip(), data[1].strip()))
Was im Endeffekt da passiert ist die Ersetzung der geschweiften Klammern durch den Inhalt der bei der format-Methode angegebenen Parameter. Ich habe hier eine recht simple Syntax verwendet.
format ist sehr mächtig.
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 13:21
von vivienj
@/me, ich habe es inzwischen weiter modifiziert und es liefert mir das gewünschte ergebnis
Code: Alles auswählen
WerteTabelle=open("C:\Users\Vivien\Desktop\WerteTabelle_1.txt","w")
with open('C:\Users\Vivien\Desktop\stress.txt') as fp1, open('C:\Users\Vivien\Desktop\design.txt') as fp2:
text1 = fp2.readlines()
text2 = fp1.readlines()
for data in zip(text1, text2):
print(data)
print('{} {}'.format(data[0].strip(), data[1].strip()))
WerteTabelle.write('{}\t {}\n'.format(data[0].strip(), data[1].strip()))
Soll für meine Zwecke erstmal reichen.
Falls doch noch jemand ne Anregung hat, wie man es für größere Tabellen das gleiche Ergenis bekommt freue ich mich natürlich, aber so soll es mir erstmal reichen.
Vielen Dank, viele Grüße und ein schönes Wochenende!
Vivien
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 13:28
von sparrow
Du hast aber noch immer unmaskierte \ in deinen Pfaden.
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 13:37
von vivienj
Hey, zu den \ an dem rechner an dem ich sonst programmiere sind die Pfade etwas länger und dort habe ich festgestellt, dass ich an manchen stellen mit \\ arbeiten muß. auf meinem
privaten geht es komischer weise so. im originalprogramm schreibe ich die programmpfade mit / die funktionieren auf jedenfall.
grüße
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 16:58
von /me
vivienj hat geschrieben:Hey, zu den \ an dem rechner an dem ich sonst programmiere sind die Pfade etwas länger und dort habe ich festgestellt, dass ich an manchen stellen mit \\ arbeiten muß. auf meinem
privaten geht es komischer weise so. im originalprogramm schreibe ich die programmpfade mit / die funktionieren auf jedenfall.
Der Punkt ist, dass ein Backslash in einem String ein Escape-Zeichen ist. Wenn du also einen einfachen Backslash verwenden möchtest, dann musst du zwei in den String schreiben damit am Ende nur einer herauskommt. Häufig funktioniert es eine Zeitlang, wenn man nur einen Backslash verwendet weil das Folgezeichen keine spezielle Bedeutung in einer Escape-Sequenz hat. Wenn man dann aber auf einmal besipielsweise ein "\n" oder "\t" im String hat, dann geht alles schief. Ein "\n" wird als NEWLINE interpretiert und ein "\t" als Tabulatorzeichen.
Daher sollte man sich von Anfang an daran gewöhnen den Backslash ordentlich zu maskieren. Eine Alternative kann die Verwendung eines Raw-Strings sein in dem jedes Zeichen so gespeichert wird wie es angegeben wurde. Ein String der mit r"\t" angegeben wird enthält dann nicht nur ein Zeichen (den Tabulator) sondern wirklich Backslash und
t.
Bei Verzeichnispfaden hingegen kann man grundsätzlich ziemlich bedenkenlos auch mit einem Vorwärtsslash arbeiten. Das funktioniert auch unter Windows und ist damit plattformübergreifend.
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 17:05
von /me
vivienj hat geschrieben:Falls doch noch jemand ne Anregung hat, wie man es für größere Tabellen das gleiche Ergenis bekommt freue ich mich natürlich, aber so soll es mir erstmal reichen.
Man könnte die Dateien zeilenweise von Hand lesen.
Code: Alles auswählen
with open('file1.txt') as fp1, open('file2.txt') as fp2:
while True:
line1 = fp1.readline()
line2 = fp2.readline()
print('{} {}\n'.format(line1.strip(), line2.strip()))
if not line1:
break
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 17:25
von vivienj
danke, die Erklärung habe ich jetzt auch was besser verstanden, sorry an sparrow, ich programmiere erst seit zweieinhalb monaten und deine aussage war mir leider unverständlich. ich werde dann vorsichtshalber mein komplettest Skript durchkämmen und diesen Missstand korrigieren.
Danke euch allen für die Tips und Anregungen.
Ich hoffe, dass ich in ner Weile auch soweit bin hier als Antwortender und nicht als Fragender aufzutreten.
Re: Zusammenfügen von zwei Text-Listen
Verfasst: Freitag 12. Oktober 2012, 17:37
von BlackJack
Statt `readline()` von Hand aufzurufen könnte man auch `itertools.izip()` auf die geöffneten Dateiobjekte anwenden.