2016-03-23 23 views
3

Ich versuche, eine Funktion zu erstellen, die 2 Textdateien kombiniert und sortiert, bevor Sie das Ergebnis in eine neue Datei schreiben. Ich habe die vorhandenen Threads zum Sortieren von Dateien sowie die Threads zum Zusammenführen von Dateien gelesen, aber ich konnte keinen finden, der meine Frage beantwortet.Mischen Sie zwei Dateien in Python und sortieren

File1: 
12:24:00: 14, 15, 16 
20:13:09: 1, 2, 3 

File2: 
08:06:02: 43, 54, 10 
15:16:05: 6, 2, 12 

Und die gewünschte Ausgangs dies wäre:

NewFile: 
20:13:09: 1, 2, 3 
15:16:05: 6, 2, 12 
12:24:00: 14, 15, 16 
08:06:02: 43, 54, 10 

Ich habe versucht, die ursprünglich den Inhalt beider Dateien in eine Liste zu verschmelzen, und es dann sortieren, bevor es in eine neue Datei zu schreiben, aber das schien nicht zu funktionieren. Hier ist das, was ich bisher versucht:

def mergeandsort(file1, file2, NewFile): 
    s1, s2, d=open(src1, 'r'), open(src2, 'r'), open(dst, 'w') 
    l=[] 
    l.append(list(s1)) 
    l.append(list(s2)) 
    n=sorted(l) 
    c=''.join(str(n)) 
    d.write(c) 
    s1.close(); s2.close(); d.close() 

Ich bin neu in Python, so dass jede Hilfe würde geschätzt!

+0

Sortierung drucken Zeit nach? Jede Zeile enthält Zeit und gefolgt von 3 ganzzahligen Werten. –

+0

Ja, ich musste eine Funktion schreiben, die nur eine Datei sortiert und die sortierte Funktion verwendet, um basierend auf den ersten drei Werten (die die Zeit ausmachen) zu sortieren. – sophia

+0

ok, ich gebe dir in den nächsten 10 bis 15 mints. –

Antwort

4

Der Versuch, Ihre Implementierung zu beheben:

def mergeandsort(src1, src2, dst): 
    # Use `with` statements to close file automatically 
    with open(src1, 'r') as s1, open(src2, 'r') as s2, open(dst, 'w') as d: 
     l = list(s1) + list(s2) 
     l.sort(reverse=true) # Since you seem to want them in reverse order... 
     c = ''.join(l) 
     d.write(c) 

Beachten Sie, dass dies nicht optimal ist, wenn Sie große Dateien manipulieren ...

4

Es folgt Schritt:

  1. lesen Dateien und dann die Liste von dort Daten erstellen.
  2. Fügen Sie zwei Liste
  3. so sortierte Funktion zum Sortieren hinzu.
  4. Verwenden Sie die umgekehrte Methode der Liste
  5. Inhalt in Datei schreiben. (Sie können dies tun)

Demo:

>>> p1 = '/home/vivek/Desktop/f1.txt' 
>>> p2 = '/home/vivek/Desktop/f2.txt' 
>>> 
>>> fp1 = open(p1) 
>>> fp2 = open(p2) 

>>> l1 = fp1.read().strip().split("\n") 
>>> l1 
['12:24:00: 14, 15, 16', '20:13:09: 1, 2, 3'] 
>>> l2 = fp2.read().strip().split("\n") 
>>> l2 
['08:06:02: 43, 54, 10', '15:16:05: 6, 2, 12'] 
>>> l3 = l1+ l2 
>>> l3 
['12:24:00: 14, 15, 16', '20:13:09: 1, 2, 3', '08:06:02: 43, 54, 10', '15:16:05: 6, 2, 12'] 
>>> sorted(l3) 
['08:06:02: 43, 54, 10', '12:24:00: 14, 15, 16', '15:16:05: 6, 2, 12', '20:13:09: 1, 2, 3'] 
>>> merge_list = sorted(l3) 
>>> merge_list.reverse() 
>>> merge_list 
['20:13:09: 1, 2, 3', '15:16:05: 6, 2, 12', '12:24:00: 14, 15, 16', '08:06:02: 43, 54, 10'] 
>>> 

Funktion:

def mergeandsort(file1, file2, output): 
    fp1, fp2 = open(file1, 'r'), open(file2, 'r') 
    merge_data = fp1.read().strip().split("\n") + fp2.read().strip().split("\n") 
    merge_data = sorted(l3, reverse=True) 
    fp = open(output, 'w') 
    for i in merge_data: 
     fp.write(i) 

    fp.close() 
    return True, output 


p1 = '/home/vivek/Desktop/f1.txt' 
p2 = '/home/vivek/Desktop/f2.txt' 
p3 = '/home/vivek/Desktop/f12.txt' 

print mergeandsort(p1, p2, p3) 
+0

danke! wenn ich das in eine andere Datei schreibe, wie mache ich es so, dass das Ergebnis wieder in Zeilen formatiert wird? – sophia

+1

Verwenden Sie '' \ n'.join (merge_list) 'beim Schreiben – Bahrom

+0

ok. das machen. keine Notwendigkeit zu danken :) –

2

Hier ist eine Alternative, die auf datetime basierten Sorten (vorausgesetzt, Sie die Inhalte von f1 und f2 in zwei Listen, l1 und l2 lesen):

l1 = ['12:24:00: 14, 15, 16', '20:13:09: 1, 2, 3'] 
l2 = ['08:06:02: 43, 54, 10', '15:16:05: 6, 2, 12'] 

from datetime import datetime 

for x in sorted(l1 + l2, key=lambda time_and_nums: datetime.strptime(time_and_nums.split(' ')[0][:-1], '%H:%M:%S'), reverse=True): 
    print(x) 

Will ist

20:13:09: 1, 2, 3 
15:16:05: 6, 2, 12 
12:24:00: 14, 15, 16 
08:06:02: 43, 54, 10 
+0

ja, wir müssen nach Zeitwert sortieren. upvoted. Gut –

Verwandte Themen