Форум сайта python.su
0
Здравствуйте друзья,
сорри за тупой вопрос, но нужна помощь новичку:
Как сравнить построчно содержимое двух текстовых файлов? Есть два текстовых файла(кол-во строк у файлов разное) со списками доменов, содержимое файлов представляет собой простой построчный список :
domain1.ru
domain2.ru
и т.д.
Нужно сравнить построчно содержимое двух текстовых файлов “file_domains1.txt” и “file_domains2.txt” на предмет совпадения доменов(совпадения строк), большинство доменов в двух файлах совпадают и задача состоит в том чтобы найти такие домены которые присутствуют только в одном из файлов(и сохранить их в “output.txt”)
большое спасибо за помощь
Отредактировано russian_bear (Янв. 8, 2015 08:04:21)
Офлайн
49
Вообще-то для этого существует утилита diff и ей подобные, но код на python может быть, например, таким:
import sys def diff(file_one, file_two): with open(file_one) as text_one, open(file_two) as text_two: one = set(text_one.read().split('\n')) two = set(text_two.read().split('\n')) return one ^ two if __name__ == '__main__': if len(sys.argv) > 2: print ('\n'.join(diff(sys.argv[1], sys.argv[2]))
./myprogram.py file1.txt file2.txt > output.txt
Отредактировано Alen (Янв. 8, 2015 09:51:32)
Офлайн
857
AlenЕсть difflib, которая реализует такой формат.
Вообще-то для этого существует утилита diff
Alenone = set(text_one.read().split('\n'))
one = set(text_one)
def diff(file_one, file_two): with open(file_one) as text_one, \ open(file_two) as text_two: return set(text_one) ^ set(text_two)
Отредактировано py.user.next (Янв. 8, 2015 11:00:22)
Офлайн
0
друзья, всем большое спасибо !
спасибо за “наводку” на модуль difflib, с его помощью получился вот такой работающий код:
import difflib
file1 = open('domains1.txt', ‘r’)
file2 = open('domains2.txt', ‘r’)
diff = difflib.ndiff(file1.readlines(), file2.readlines())
delta = ''.join(x for x in diff if x.startswith('- '))
f = open(“out_difference.txt”,“w”)
f.write(delta)
f.close()
print delta
Офлайн
0
столкнулся с проблемой при работе с большими файлами. Если оба файла имеют несколько десятков строк - прога отрабатывает мгновенно, если несколько сотен - уже заметно долго, запустил на сравнение двух файлов по 3000 строк в каждом - не дождался результата, пришлось прибить процесс python.exe. А вообще мне надо сравнивать два файла у которых около 200 000 строк в каждом, получается нужно суперкомпьютер покупать ?
Друзья, подскажите, правильно-ли я понимаю что :
1)сложность вычислений при увеличении кол-ва строк возрастает квадратично т.к. при 100 строках в каждом файле мы имеем 100*100 = 10 000 операций сравнений, а при 10 000 строках в каждом файле уже 100 000 000 (сто миллионов !) операций сравнений , так ?
2)python в принципе высокоуровневый язык и не заточен под такие операции, подозреваю что прога написанная на C++ выполняла-бы подобные операции быстрее чем прога на python, так ?
спасибо
Офлайн
857
russian_bear
столкнулся с проблемой при работе с большими файлами.
russian_beardiff = difflib.ndiff(file1.readlines(), file2.readlines())
diff = difflib.ndiff(tuple(file1), tuple(file2))
russian_bearНе нужно делать .join(), пиши сразу в файл вывода через .writelines().delta = ''.join(x for x in diff if x.startswith('- '))
delta = (x for x in diff if x.startswith('- ')) f.writelines(delta)
russian_bearВот после этих изменений проверь.
запустил на сравнение двух файлов по 3000 строк в каждом - не дождался результата
russian_bearУ питона время уходит на интерпретацию кода скрипта, тогда как diff - это скомпилированная программа.
что прога написанная на C++ выполняла-бы подобные операции быстрее чем прога на python, так ?
Отредактировано py.user.next (Янв. 9, 2015 12:35:44)
Офлайн
49
Почему вы не используйте, то что вам изначально дали.
#!/usr/bin/env python from random import randint def generate_file_for_compare(): with open('1.txt', 'w') as one, open('2.txt', 'w') as two: for _ in range(200000): one.write('{!s}\n'.format(randint(1, 10000))) two.write('{!s}\n'.format(randint(5000, 15000))) def diff(): with open('1.txt') as text_one, open('2.txt') as text_two: return set(text_one) ^ set(text_two) if __name__ == '__main__': generate_file_for_compare() with open('result.txt', 'w') as result: for i in diff(): result.write(i)
Отредактировано Alen (Янв. 9, 2015 12:45:00)
Офлайн
0
Alen
from random import randint
def generate_file_for_compare():
with open('1.txt', ‘w’) as one, open('2.txt', ‘w’) as two:
for _ in range(10000):
one.write('{!s}\n'.format(randint(1, 10000)))
two.write('{!s}\n'.format(randint(5000, 15000)))
def diff():
with open('1.txt') as text_one, open('2.txt') as text_two:
return set(text_one) ^ set(text_two)
if __name__ == ‘__main__’:
generate_file_for_compare()
with open('result.txt', ‘w’) as result:
for i in diff():
result.write(str(i))
Офлайн
0
py.user.next
Прикреплённый файлы:
liberty_basic_comparison.bas (740 байт)
Офлайн
49
russian_bear
спасибо.
но в результате исполнения этого кода на выходе получаю просто какие-то цифири типа
#!/usr/bin/env python def diff(): with open('domains1.txt') as text_one, \ open('domains2.txt') as text_two: return set(text_one) ^ set(text_two) if __name__ == '__main__': with open('res.txt', 'w') as result: for i in diff(): result.write(i)
Отредактировано Alen (Янв. 9, 2015 13:08:45)
Офлайн