Potrzebuję porównać dwa pliki i przekierować różne linie do trzeciego pliku. Wiem, używając polecenia diff i mogę uzyskać różnicę. Ale czy jest jakiś sposób robienia tego w pythonie? Wszelkie przykładowy kod będzie pomocnePorównywanie dwóch plików tekstowych w pythonie
Odpowiedz
odjazdu difflib
Moduł ten oferuje lekcje i funkcje służące do porównywania sekwencji. To może być stosowane na przykład, dla porównania pliki, a może produkować różnicę informacji w różnych formatach, w tym HTML i kontekstu i zunifikowanych dyferencjału [...]
przykładem wiersza polecenia w http://docs.python.org/library/difflib.html#difflib-interface
import sys
if len(sys.argv) !=3 :
print "usage:" + sys.argv[0] + " bla bla"
exit
elif len(sys.argv) == 3:
file1 = set((x for x in open(sys.argv[1])))
file2 = set((x for x in open(sys.argv[2])))
file3 = file2.difference(file1)
file4 = file1.difference(file2)
str1="file1-contains but file2 not \n"
str2="file2-contains but file1 not\n"
FILE = open('file3','w')
FILE.writelines(str2)
FILE.writelines(file3)
FILE.writelines(str1)
FILE.writelines(file4)
#compare 2 text files.
test1filehandle = open("test1.txt", "r") #creating a file handle
test2filehandle=open("test2.txt","r") #creating a file handle to read
test3filehandle=open("test3.txt","w") #creating a file handle to write
test1list= test1filehandle.readlines() #read the lines and store in the list
test2list=test2filehandle.readlines()
k=1
for i,j in zip(test1list,test2list): #zip is used to iterate the variablea in 2 lists simultaneoously
if i !=j:
test3filehandle.write("Line Number:" +str(k)+' ')
test3filehandle.write(i.rstrip("\n") + ' '+ j)
k=int(k)
k=k+1;
Dlaczego upadek? Może wytłumaczysz swój kod Rekha? –
Porównywanie dwóch plików tekstowych w Pythonie?
Oczywiście, difflib ułatwia.
Ustawmy demo:
f1path = 'file1'
f2path = 'file2'
text1 = '\n'.join(['a', 'b', 'c', 'd', ''])
text2 = '\n'.join(['a', 'ba', 'bb', 'c', 'def', ''])
for path, text in ((f1path, text1), (f2path, text2)):
with open(path, 'w') as f:
f.write(text)
Teraz sprawdzamy diff. Linie, które używają os
i time
są jedynie wykorzystywane w celu zapewnienia godnej znacznik czasu po raz ostatni pliki zostały zmienione i są całkowicie opcjonalne i są opcjonalne argumenty difflib.unified_diff
:
# optional imports:
import os
import time
# necessary import:
import difflib
Teraz wystarczy otworzyć pliki, i przekazać listę swoich liniach (z f.readlines
) do difflib.unified_diff
i dołącz wyjście listę z pustym ciągiem znaków, drukowanie wyników:
with open(f1path, 'rU') as f1:
with open(f2path, 'rU') as f2:
readable_last_modified_time1 = time.ctime(os.path.getmtime(f1path)) # not required
readable_last_modified_time2 = time.ctime(os.path.getmtime(f2path)) # not required
print(''.join(difflib.unified_diff(
f1.readlines(), f2.readlines(), fromfile=f1path, tofile=f2path,
fromfiledate=readable_last_modified_time1, # not required
tofiledate=readable_last_modified_time2, # not required
)))
wyświetlającą:
--- file1 Mon Jul 27 08:38:02 2015
+++ file2 Mon Jul 27 08:38:02 2015
@@ -1,4 +1,5 @@
a
-b
+ba
+bb
c
-d
+def
Ponownie, można usunąć wszystkie linie, które są zadeklarowane jako opcjonalne/niewymagane i uzyskać w przeciwnym razie takie same wyniki bez znacznika czasu.
przekierować różne linie do trzeciego pliku
zamiast drukowania, otwórz trzeci plik pisać wiersze:
difftext = ''.join(difflib.unified_diff(
f1.readlines(), f2.readlines(), fromfile=f1path, tofile=f2path,
fromfiledate=readable_last_modified_time1, # not required
tofiledate=readable_last_modified_time2, # not required
))
with open('diffon1and2', 'w') as diff_file:
diff_file.write(difftext)
oraz:
$ cat diffon1and2
--- file1 Mon Jul 27 11:38:02 2015
+++ file2 Mon Jul 27 11:38:02 2015
@@ -1,4 +1,5 @@
a
-b
+ba
+bb
c
-d
+def
- 1. Porównywanie dwóch list w Pythonie
- 2. Porównywanie dwóch plików przechwytywania Wireshark
- 3. Jak przeplatać linie z dwóch plików tekstowych
- 4. Porównywanie list w Pythonie
- 5. postgres - porównywanie dwóch tablic
- 6. Porównywanie dwóch twarzy w Androidzie
- 7. Porównywanie przedmiotów w dwóch listach
- 8. Porównywanie dwóch ciągów ruby
- 9. Porównywanie dwóch CGRects
- 10. Porównywanie dwóch tablic
- 11. Porównywanie dwóch obiektów kalendarza
- 12. Porównywanie bibliotek komputerowych w pythonie
- 13. Porównywanie dwóch tablic dla dwóch wartości
- 14. Porównywanie dwóch list z MSpec
- 15. Porównywanie nazw plików Win32
- 16. Łączenie wewnętrzne w dwóch plikach tekstowych
- 17. Porównywanie dwóch wektorów w instrukcji if
- 18. Porównywanie dwóch ciągów w SQL Server
- 19. Jak porównać zmodyfikowaną datę dwóch plików w pythonie?
- 20. Usuwanie niedrukowalnych znaków "gremlin" z plików tekstowych
- 21. Skuteczne odczytywanie dużych plików tekstowych
- 22. Porównywanie plików backbone.js i Dojo
- 23. Porównywanie dwóch dokumentów za pomocą wyrażeń regularnych
- 24. Porównywanie dwóch typów enum * dla równoważności?
- 25. Porównywanie dwóch ramek danych i uzyskiwanie różnic
- 26. Porównywanie dwóch list i znajdowanie indeksów zmian
- 27. Parsowanie dużych plików tekstowych, zmodyfikowanych w locie
- 28. Porównywanie dwóch obiektów Joda-Time DateTime
- 29. Przeplatanie dwóch list w Pythonie
- 30. przetwarzanie tekstu z dwóch plików
Bez względu na to, czy ten kod działa, tak naprawdę nie wyjaśnia, jak to zrobić kapelusz pyta. – yoozer8