Zusammenfügen von zwei Text-Listen

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
vivienj
User
Beiträge: 6
Registriert: Freitag 12. Oktober 2012, 10:37

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:

Code: Alles auswählen

Laenge Hoehe Breite
1     10     100
2     20     200
...
die zweite

Code: Alles auswählen

Stress
12
22
...
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:

Code: Alles auswählen

2     20    200   12
2     20    200   22 
...
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
Zuletzt geändert von Anonymous am Freitag 12. Oktober 2012, 12:13, insgesamt 1-mal geändert.
Grund: Code-Formatierung aktiviert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
vivienj
User
Beiträge: 6
Registriert: Freitag 12. Oktober 2012, 10:37

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
vivienj
User
Beiträge: 6
Registriert: Freitag 12. Oktober 2012, 10:37

@/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
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
vivienj
User
Beiträge: 6
Registriert: Freitag 12. Oktober 2012, 10:37

@/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
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Du hast aber noch immer unmaskierte \ in deinen Pfaden.
vivienj
User
Beiträge: 6
Registriert: Freitag 12. Oktober 2012, 10:37

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
vivienj
User
Beiträge: 6
Registriert: Freitag 12. Oktober 2012, 10:37

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.
BlackJack

Statt `readline()` von Hand aufzurufen könnte man auch `itertools.izip()` auf die geöffneten Dateiobjekte anwenden.
Antworten