2017-10-27 3 views
1

Ich bin zur Zeit neu zu Python, und ich möchte folgendes tun:Concatenate Dateien mit mehreren Wörtern innerhalb

In text1.txt, werde ich:

1 
2 
7 
9 

In text2.txt, ich habe wird:

1 
2 
2 
2 
3 
4 

ich nach einer Lösung suchen, die meine Ausgabe in dieser bestimmten Reihenfolge aussehen:

Zuerst möchte ich diese 2 Dateien vergleichen und danach eine verkettete Datei erhalten, aber wenn eine der Dateien mehrfach ein Wort hat, was in beiden Dateien üblich ist, würde ich das gerne in der Ausgabe sehen, die sollte auch eine Datei sein, um es so oft zu haben, wie es in der Datei ist, die am häufigsten die gleiche Wiederholung falsch hat. In diesem Fall hat 3 mal 2 und file1 hat 1 mal 2, also möchte ich es in der Ausgabe 3 mal haben 2, aber die Anzahl der zusätzlichen Male von 2, um am Ende zu sein. Am Ende der Ausgabe sollte auch hinzugefügt werden, was zwischen zwei Dateien nicht üblich ist. Ich begann wie folgt und bis jetzt vergleiche diese 2 Dateien und verkettet sie, aber ich weiß nicht, wie auch die gefundenen mehr gemeinsamen Worte hinzuzufügen:

import glob 
read_files=glob.glob("1.txt,output1.txt") 
file1=open('1.txt','r') 
file3=open('3.txt','r') 
with open('3.txt', 'r') as file3: 
    with open('1.txt', 'r') as file1: 
     same1 = set(file3).difference(file1) 

same1.discard('\n') 

with open('output1.txt', 'w') as file_out: 
    for line in same1: 
     file_out.write(line) 

filename=['output1.txt','1.txt'] 
with open('output_final.txt', 'w') as outfile: 
    for fname in filename: 
      with open(fname) as infile: 
        for line in infile: 
       outfile.write(line) 

Es ist eine Möglichkeit, 1 Datei aus dem Dateinamen zu wählen Liste? Etwas wie z.B. Dateiname (1) um nur die erste Datei oder die zweite Datei zu manipulieren? Es ist ziemlich schwierig zu erklären, aber ich denke, dass das Beispiel als eine Referenz besser als meine Erklärung verwendet werden kann.

+0

zwei dicts Stellen, innen speichern, dann zusammenführen und das Maximum jeder Zelle nehmen? –

Antwort

0

Falls Sie jemals diese Art von Code benötigen würde, hier ist es:

import fileinput 
import collections 
import re 
import csv 
import xlrd 

file1=open('1.txt','r') 
file3=open('3.txt','r') 
with open('3.txt', 'r') as file3: 
    with open('1.txt', 'r') as file1: 
     diff = set(file3).difference(file1) 

diff.discard('\n') 

with open('difference.txt', 'w') as file_out: 
    for line in diff: 
     file_out.write(line) 

finput = fileinput.FileInput('1.txt') 
finput.next() 
ginput = fileinput.FileInput('3.txt') 
ginput.next() 

lines1=open('1.txt','r').read().splitlines() 
lines2=open('3.txt','r').read().splitlines() 

with open('duplicate.txt','w') as gout: 
    count1 = collections.Counter(lines1) 
    count2 = collections.Counter(lines2) 

    final_lines = lines1 
    seen = set() 

    for line in lines2: 
     if line not in seen: 
      seen.add(line) 
      if count1[line] < count2[line]: 
       final_lines += ([line] * (count2[line] - count1[line])) 

    for line in final_lines: 
     gout.write("%s\n" % line) 
0

Ich denke, Sie können nur beide Dateien als Liste (ich nehme an, dass sie nicht riesig sind) und dann iterieren über die erste und entfernen Sie diese Elemente aus der zweiten und dann verketten die Listen. Etwas wie:

with open('text1.txt', 'r') as f: 
    li1 = f.readlines() 
with open('text2.txt', 'r') as f: 
    li2 = f.readlines() 

li1 = list(map(lambda t: int(t.strip()), li1)) 
li2 = list(map(lambda t: int(t.strip()), li2)) 

for i in li1: 
    try: 
     li2.remove(i) 
    except ValueErorr: 
     pass 

li1.extend(li2) 

li1 sollte die gewünschte Ausgabe haben jetzt:

In [27]: print(li1) 
[1, 2, 7, 9, 2, 2, 3, 4] 
+1

Dies wird Union von set li1 und set li2 geben, aber OP will etwas anderes –

+0

Ich habe versucht, diesen Code auf meinen Code anzuwenden, aber ich bekomme den folgenden Fehler: Traceback (zuletzt letzten Aufruf): Datei "out2.py" , Zeile 28, in LI1 = list (Karte (Lambda-t: int (t.strip()), LI1)) File "out2.py", Zeile 28, in LI1 = list (Karte (lambda t : int (t.strip()), li1)) ValueError: ungültiges Literal für int() mit Basis 10: '' Irgendeine Idee, was könnte das verursachen? – dante

+0

Ich habe herausgefunden, wie man diesen Fehler löst, aber die Ausgabe ist nicht, was ich erwartet hatte: [1, 2, 3, 4, 2] Jede andere Lösung, die helfen würde? – dante

Verwandte Themen