2012-04-10 2 views
0

Фон: С помощью скрипта Python я очищаю данные (html) с веб-сайта и помещаю эти данные в документ CSV.Python - Сравнение двух документов CSV от одного и того же сценария python от обновления до другого

Этот документ CSV выглядит следующим образом:

Hong Kong;The Jardine Engineering Corporation Limited 
Hong Kong;Towngas 
Hong Kong;Tricor Services Limited 
Hong Kong;UL International Limitied 
Hong Kong;Urban Property Management Limited 
Hong Kong;VTECH Corporate Services Ltd. 
Vietnam;Cam Ranh Computer Co. Ltd 
Vietnam;CFTP Company 
Vietnam;Chevron Vietnam 

Первая колонка: Страна

Вторая колонка: Имя

Мой файл более чем 5000 строк.

Мне нужно сравнить этот документ CSV с другим (из того же сценария, такой же структуры), чтобы отслеживать возможные изменения (если у нас есть новые строки или удалены).Лучше всего создать файл со всеми изменениями или распечатать их в терминале.

* помнить, что если что-то изменить в файле CSV (еще один ряд) все данные собираются быть сдвинуты *

+0

Добро пожаловать в переполнение стека. У вас еще есть это? С каким битом вы застряли? – Flexo

ответ

1

Добро пожаловать на StackOverflow. :)

Ваша проблема сводится к выполнению разницы между двумя списками. Это доступно в Python через difflib.

Этот пример из руководства должен помочь вам:

>>> diff = ndiff('one\ntwo\nthree\n'.splitlines(1), 
...    'ore\ntree\nemu\n'.splitlines(1)) 
>>> diff = list(diff) # materialize the generated delta into a list 
>>> print ''.join(restore(diff, 1)), 
one 
two 
three 
>>> print ''.join(restore(diff, 2)), 
ore 
tree 
emu 

Для печати изменений в файл:

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n'] 
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n'] 
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'): 
...  sys.stdout.write(line) 
--- before.py 
+++ after.py 
@@ -1,4 +1,4 @@ 
-bacon 
-eggs 
-ham 
+python 
+eggy 
+hamster 
guido 
+1

Кажется совершенным! Я пробую это и вернусь через несколько минут;) –

1

Использование GNU diff. Это инструмент командной строки, предназначенный для того, чтобы сделать точно, что вы хотите. Доступны версии GUI.

Материал из Википедии:

В вычислительной технике, diff утилита сравнения файл, который выводит различия между двумя файлами. Обычно он используется для отображения изменений между одной версией файла и прежней версией того же файла. Diff отображает изменения, внесенные в строку для текстовых файлов. Современные реализации также поддерживают двоичные файлы. [1] Вывод называется «diff» или патчем, так как выход может быть применен с программным патчем Unix. Вывод аналогичных утилит сравнения файлов также называется «diff»; как использование слова «Grep» для описания акта поиска, слово дифф используется в жаргоне как глагол для вычисления разницы. [править]

Давать вам преимущество сомнения, вам вероятно, пытался Google для чего-то вроде «Найти различия между двумя файлами csv из Python». Если вы забудете тот факт, что файлы имеют формат csv или что они были созданы с использованием Python, поиск find differences between text files нашел бы для вас GNU diff.


Edit:

Добавление одной строки не создает никаких проблем для GNU diff. Он найдет одну строку, которая изменилась, и расскажет вам об этом.

Пример:

[email protected]:~$ cat file1 
alpha 
beta 
charlie 
delta 
echo 
foxtrot 

[email protected]:~$ cat file2 
alpha 
beta 
charlie 
CHAMELEON 
delta 
echo 
foxtrot 

[email protected]:~$ diff file1 file2 
3a4 
> CHAMELEON 
+0

Большое спасибо за ваш быстрый ответ. Я уже пробовал с Diff, но когда одна строка новая ... все сдвинуто так, что много строк выставляются как новые ... но это не так. –

+1

@Carto_: мой тривиальный пример (выше) дает ожидаемый результат, когда одна строка вставлена ​​в середину файла. Можете ли вы опубликовать пример своих данных, где 'diff' не выполняет то, что вы ожидаете? –

0
OLD_PATH = r'/Users/abelrossignol/Desktop/1.csv' 
NEW_PATH = r'/Users/abelrossignol/Desktop/2.csv' 

out = open("Out.txt", 'w') 

old = open(OLD_PATH, 'r') 
old_lines = list(old) 
old.close() 

new = open(NEW_PATH, 'r') 
new_lines = list(new) 
new.close() 

for line in unified_diff(old_lines, new_lines, fromfile=OLD_PATH, tofile=NEW_PATH): 
    out.write(line) 
    print("Writter") 

Кажется, работает отлично. Я все еще пытаюсь понять структуру Out.txt, но самое сложное.

Большое спасибо за вашу помощь ;-)

Я надеюсь, что может быть полезным один день для других людей.

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