2011-07-07 3 views
0

Метод difflib.context_diff возвращает генератор, показывая вам разные строки из 2 сравниваемых строк. Как написать результат (сравнение), в текстовый файл?В Python можно написать вывод генераторов (context_diff) в текстовый файл?

В этом примере кода мне нужно все, начиная с строки 4 до конца в текстовом файле.

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

Заранее благодарен!

+3

Это не имеет ничего общего с генераторами или context_diff. Это в основном «Как написать файл?» Вы должны прочитать http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files –

ответ

9
with open(..., "w") as output: 
    diff = context_diff(...) 
    output.writelines(diff) 

Смотрите documentation для file.writelines().

Объяснение:

  1. with является менеджером контекста: он обрабатывает закрытие файла, когда вы закончите. Это не обязательно, но это хорошая практика, - вы могли бы точно так же сделать

    output = open(..., "w") 
    

    , а затем либо вызвать output.close() или пусть Python сделать это для вас (когда output собирается менеджером памяти).

  2. "w" означает, что вы открываете файл в режиме записи, а не "r" (считайте, по умолчанию). Существуют различные варианты, которые вы можете поставить здесь (+ для append, b для двоичного iirc).

  3. writelines принимает любые итерации строк и записывает их в файл-объект по одному за раз. Это то же самое, что и for line in diff: output.write(line), но более аккуратный, поскольку итерация неявная.

0
f = open(filepath, 'w') 
for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'): 
    f.write("%s\n" %line) 

f.close() 
Смежные вопросы