2013-04-07 1 views
10

Я пытаюсь использовать difflib для создания diff для двух текстовых файлов, содержащих твиты. Вот код:python difflib сравнение файлов

#!/usr/bin/env python 

# difflib_test 

import difflib 

file1 = open('/home/saad/Code/test/new_tweets', 'r') 
file2 = open('/home/saad/PTITVProgs', 'r') 

diff = difflib.context_diff(file1.readlines(), file2.readlines()) 
delta = ''.join(diff) 
print delta 

Вот PTITVProgs текстовый файл:

Watch PTI on April 6th (7) Dr Israr Shah at 10PM on Business Plus in "Talking Policy". Rgds #PTI 
CORRECTION!! Watch PTI on April 6th (5) @Asad_Umar at 8PM on ARY News. Rgds #PTI 
Watch PTI on April 6th (5) @Asad_Umar at 8PM on AAJ News (6) PTI vs PMLN at 8PM on NewsOne. Rgds #PTI 
Watch PTI on April 6th (5) Asad Umar at 8PM on AAJ News (6) PTI vs PMLN at 8PM on NewsOne. Rgds #PTI 
Watch PTI on April 6th (5) Waleed Iqbal at 8PM on Channel 5. Rgds #PTI 
Watch PTI on April 6th (3) Dr Israr Shah at 10PM on PTV News. Rgds #PTI 
Watch PTI on April 6th (4) Javed hashmi at 1PM on PTV News. Rgds #PTI 
Watch PTI on April 6th (3) Imran Alvi at 1PM on AAJ News. Rgds #PTI 
Watch PTI on April 6th (1) Dr @ArifAlvi, Andleeb Abbas and Ehtisham Ameer at 11PM on ARY News (2) Hamid Khan at 10PM on ATV. Rgds #PTI 
Watch PTI on April 5th (1) Farooq Amjad Meer at 10:45PM on Dunya News. Rgds #PTI 
Watch PTI on April 4th (4) Faisal Khan at 8PM on PTV News. Rgds #PTI 
@FaisalJavedKhan 
Watch PTI on April 4th (3) Faisal Khan at 11PM on ATV. Rgds #PTI 
@FaisalJavedKhan 
Watch PTI on April 4th (1) Dr Israr Shah at 8PM on Waqt News (2) Dr Arif Alvi at 9PM on PTV World. Rgds #PTI 
@ArifAlvi 
Watch PTI on April 3rd (12) Abrar ul Haq on 10PM on Dawn News (13) Shabbir Sial at 10PM on Channel5. Rgds #PTI 
Watch PTI on April 3rd (11) Sadaqat Abbasi on 8PM on RohiTV. Rgds #PTI 
Watch PTI on April 3rd (10) Dr Zarqa and Andleeb Abbas on 8PM on Waqt News. Rgds #PTI 
Watch PTI on April 3rd (9) Fauzia Kasuri at 8PM on Din News. Rgds #PTI 
Watch PTI on April 3rd (8) Mehmood Rasheed at 8PM on ARY News. Rgds #PTI 
Watch PTI on April 3rd (7) Israr Abbasi (Repeat on Arp 4th) at 1:20AM and 1PM on Vibe TV. Rgds #PTI 
Watch PTI on April 3rd (5) Rao Fahad at 9PM on Express News (6) Dr Seems Zia at 10:30PM on Health TV. Rgds #PTI 

Вот new_tweets текстовый файл:

Watch PTI on April 7th (3) Malaika Reza at 8PM on AAJ News (4) Shah Mehmood Qureshi at 8PM on Geo News. Rgds #PTI 
Watch PTI on April 7th (2) Chairman IMRAN KHAN at 10PM on PTV News in News Night with Sadia Afzal, Rpt: 2AM, 2PM. Rgds #PTI 
@ImranKhanPTI 
Watch PTI on April 7th (1) Dr Waseem Shahzad NOW at 6PM on PTV News. Rgds #PTI 
Watch PTI on April 6th (7) Dr Israr Shah at 10PM on Business Plus in "Talking Policy". Rgds #PTI 
CORRECTION!! Watch PTI on April 6th (5) @Asad_Umar at 8PM on ARY News. Rgds #PTI 
Watch PTI on April 6th (5) @Asad_Umar at 8PM on AAJ News (6) PTI vs PMLN at 8PM on NewsOne. Rgds #PTI 
Watch PTI on April 6th (5) Asad Umar at 8PM on AAJ News (6) PTI vs PMLN at 8PM on NewsOne. Rgds #PTI 
Watch PTI on April 6th (5) Waleed Iqbal at 8PM on Channel 5. Rgds #PTI 
Watch PTI on April 6th (3) Dr Israr Shah at 10PM on PTV News. Rgds #PTI 
Watch PTI on April 6th (4) Javed hashmi at 1PM on PTV News. Rgds #PTI 
Watch PTI on April 6th (3) Imran Alvi at 1PM on AAJ News. Rgds #PTI 
Watch PTI on April 6th (1) Dr @ArifAlvi, Andleeb Abbas and Ehtisham Ameer at 11PM on ARY News (2) Hamid Khan at 10PM on ATV. Rgds #PTI 
Watch PTI on April 5th (1) Farooq Amjad Meer at 10:45PM on Dunya News. Rgds #PTI 
Watch PTI on April 4th (4) Faisal Khan at 8PM on PTV News. Rgds #PTI 
@FaisalJavedKhan 
Watch PTI on April 4th (3) Faisal Khan at 11PM on ATV. Rgds #PTI 
@FaisalJavedKhan 
Watch PTI on April 4th (1) Dr Israr Shah at 8PM on Waqt News (2) Dr Arif Alvi at 9PM on PTV World. Rgds #PTI 
@ArifAlvi 
Watch PTI on April 3rd (12) Abrar ul Haq on 10PM on Dawn News (13) Shabbir Sial at 10PM on Channel5. Rgds #PTI 
Watch PTI on April 3rd (11) Sadaqat Abbasi on 8PM on RohiTV. Rgds #PTI 
Watch PTI on April 3rd (10) Dr Zarqa and Andleeb Abbas on 8PM on Waqt News. Rgds #PTI 
Watch PTI on April 3rd (9) Fauzia Kasuri at 8PM on Din News. Rgds #PTI 

Вот разница я получаю от программы:

*** 
--- 
*************** 
*** 1,7 **** 
- Watch PTI on April 7th (3) Malaika Reza at 8PM on AAJ News (4) Shah Mehmood Qureshi at 8PM on Geo News. Rgds #PTI 
- Watch PTI on April 7th (2) Chairman IMRAN KHAN at 10PM on PTV News in News Night with Sadia Afzal, Rpt: 2AM, 2PM. Rgds #PTI 
- @ImranKhanPTI 
- Watch PTI on April 7th (1) Dr Waseem Shahzad NOW at 6PM on PTV News. Rgds #PTI 
    Watch PTI on April 6th (7) Dr Israr Shah at 10PM on Business Plus in "Talking Policy". Rgds #PTI 
    CORRECTION!! Watch PTI on April 6th (5) @Asad_Umar at 8PM on ARY News. Rgds #PTI 
    Watch PTI on April 6th (5) @Asad_Umar at 8PM on AAJ News (6) PTI vs PMLN at 8PM on NewsOne. Rgds #PTI 
--- 1,3 ---- 
*************** 
*** 21,24 **** 
    Watch PTI on April 3rd (12) Abrar ul Haq on 10PM on Dawn News (13) Shabbir Sial at 10PM on Channel5. Rgds #PTI 
    Watch PTI on April 3rd (11) Sadaqat Abbasi on 8PM on RohiTV. Rgds #PTI 
    Watch PTI on April 3rd (10) Dr Zarqa and Andleeb Abbas on 8PM on Waqt News. Rgds #PTI 
! Watch PTI on April 3rd (9) Fauzia Kasuri at 8PM on Din News. Rgds #PTI--- 17,23 ---- 
    Watch PTI on April 3rd (12) Abrar ul Haq on 10PM on Dawn News (13) Shabbir Sial at 10PM on Channel5. Rgds #PTI 
    Watch PTI on April 3rd (11) Sadaqat Abbasi on 8PM on RohiTV. Rgds #PTI 
    Watch PTI on April 3rd (10) Dr Zarqa and Andleeb Abbas on 8PM on Waqt News. Rgds #PTI 
! Watch PTI on April 3rd (9) Fauzia Kasuri at 8PM on Din News. Rgds #PTI 
! Watch PTI on April 3rd (8) Mehmood Rasheed at 8PM on ARY News. Rgds #PTI 
! Watch PTI on April 3rd (7) Israr Abbasi (Repeat on Arp 4th) at 1:20AM and 1PM on Vibe TV. Rgds #PTI 
! Watch PTI on April 3rd (5) Rao Fahad at 9PM on Express News (6) Dr Seems Zia at 10:30PM on Health TV. Rgds #PTI 

Как вы можете видеть, быстро сравнивая два исходных файла (PTITVProgs и new_tweets), что разница между ними равна 3 твита, которые были 7 апреля и 3 твита 3 апреля.

Мне просто нужны строки в new_tweets, которые не находятся в PTITVProgs, чтобы появиться в разн.

Но он бросает кучу текста, который я не хочу видеть. Я не знаю, что *** 1,7*** и *** 1,3*** в стойке для дифференциального выхода для ...? Каков правильный способ получить только измененные строки?

+1

Я не уверен, что difflib является правильным инструментом для работы, которую вы пытаетесь вообще-то - гораздо больше работы (с алгоритмической точки зрения), чтобы генерировать diff, чем просто выполнить сравнение. 'print set (fileA.readlines()). difference (set (fileB.readlines())) –

ответ

20

Просто разобрать вывод дифф как это (изменение «-» к «+», если это необходимо):

#!/usr/bin/env python 

# difflib_test 

import difflib 

file1 = open('/home/saad/Code/test/new_tweets', 'r') 
file2 = open('/home/saad/PTITVProgs', 'r') 

diff = difflib.ndiff(file1.readlines(), file2.readlines()) 
delta = ''.join(x[2:] for x in diff if x.startswith('- ')) 
print delta 
14

В библиотеке difflib существует несколько стилей различий и существуют разные функции. unified_diff, ndiff и context_diff.

Если вы не хотите, чтобы номер строки сводки, ndiff функции дает дельту Отличается стиль:

import difflib 

f1 = '''1 
2 
3 
4 
5''' 
f2 = '''1 
3 
4 
5 
6''' 

diff = difflib.ndiff(f1,f2) 

for l in diff: 
    print(l) 

Выход:

1 
- 2   
    3   
    4   
    5 
+ 6 

EDIT:

Вы могли бы также проанализируйте diff, чтобы извлечь только изменения, если это то, что вы хотите:

>>>changes = [l for l in diff if l.startswith('+ ') or l.startswith('- ')] 

>>>for c in changes: 
     print(c) 
>>> 
- 2 
+ 6 
+1

Из того, как я прочитал вопрос, OP не хочет также использовать контекстные строки. Ответ @ gatto выше делает лучшую работу, соответствующую формату, который хочет OP. –

 Смежные вопросы

  • Нет связанных вопросов^_^