Python: сравнить два файла

#python

#python

Вопрос:

У меня есть два входных файла:

авиакомпания scandinavian t airline авиакомпания
один n 0 номер
рейса шесть n 0 номер рейса
два n 0 номер рейса
три n 0 номер рейса

speedbird t авиакомпания авиакомпания
один n 0 номер
рейса шесть n 0 номер рейса
восемь n 0 номер рейса

Мой второй входной файл:

скандинавская авиакомпания t
airli один n 0 номер
рейса шесть n 0 номер рейса
два n 0 номер рейса
три n 0 номер рейса

шесть n 0 flightnumber
восемь n 0 flightnumber

У меня есть следующий код:

 with open('output_ref.txt', 'r') as file1:
with open('output_ref1.txt', 'r') as file2:
same = set(file1).difference(file2)
print same
print "n"

same.discard('n')

with open('some_output_file.txt', 'w') as FO:
for line in same:
    FO.write(line)
  

И я получаю вывод в виде:

скандинавская авиакомпания t airline авиакомпания
speedbird авиакомпания t airline авиакомпания

Но мой фактический результат должен быть:

скандинавская авиакомпания t авиакомпания
speedbird t авиакомпания авиакомпания
один n 0 номер рейса

Может кто-нибудь помочь мне в решении проблемы??

Комментарии:

1. Набор уникален. Таким образом, у вас есть только одна строка «one n 0 flightnumber» после выполнения ‘set (file1)’. Может быть, вы предпочли бы список?

2. В Python есть встроенный difflib (в стороне, поскольку он не отвечает на заданный вопрос).

Ответ №1:

Прежде всего, если то, что вы пытаетесь сделать, это получить общие строки из файла 2 (что предполагает «одинаковое» имя переменной), тогда вам следует использовать метод пересечения вместо difference . Кроме того, оба этих метода, как утверждается, требуют наборов в качестве своих аргументов, поэтому я бы сделал дополнительный шаг и тоже превратил второй файл в набор . Итак, новый код должен быть:

  first = set(file1)
 second = set(file2)
 same = first.intersection(second)
  

…..

Редактировать :

чтение некоторых комментариев к моему сообщению убедило меня, что вы действительно хотите разницу, и не в наборах, а в списках. Я думаю, это должно сработать для вас :

 difference = list(file1)
second = list(file2)
for line in second:
    try:
        first.remove(line)
    except ValueError,e:
        print e # alternately you could just pass here
  

Комментарии:

1. Нет, это не решение его проблемы. Как говорит @cyrille-pontvieux, это не удается, потому что set устраняет дубликаты и one n 0 flightnumber появляется в обоих объектах set.

2. авиакомпания speedbird t airline присутствует только в первом файле. Кроме того, если то, что он хочет, не является общими строками, тогда, я думаю, называть переменную «same» действительно плохой идеей

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

Ответ №2:

 def diff(a, b):
    y = []
    for x in a:
        if x not in b:
            y.append(x)
        else:
            b.remove(x)
    return y

with open('output_ref.txt', 'r') as file1:
    with open('output_ref1.txt', 'r') as file2:
        same = diff(list(file1), list(file2))
        print same
        print "n"

if 'n' in same:
    same.remove('n')

with open('some_output_file.txt', 'w') as FO:
    for line in same:
        FO.write(line)
  
 $ python compare.py
['scandinavian t airline airlinen', 'speedbird t airline airlinen', 'one n 0 flightnumbern']



$ cat some_output_file.txt 
scandinavian t airline airline
speedbird t airline airline
one n 0 flightnumber
  

Комментарии:

1. Добро пожаловать 🙂 Интересно, почему кто-то отказался от ответа после того, как был принят op.