Сравнение двух разных файлов по строкам в python

У меня есть два разных файла, и я хочу сравнить их содержимое по строкам и написать их общее содержимое в другом файле. Обратите внимание, что оба они содержат пробелы. Вот мой псевдокод:

file1 = open('some_file_1.txt', 'r')
file2 = open('some_file_2.txt', 'r')
FO = open('some_output_file.txt', 'w')

for line1 in file1:
    for line2 in file2:
        if line1 == line2:
            FO.write("%s\n" %(line1))

FO.close()
file1.close()
file2.close()

Однако, делая это, я получил много пробелов в моем файле FO. Похоже, что здесь также написаны простые пробелы. Я хочу написать только текстовую часть. Может кто-нибудь, пожалуйста, помогите мне.

Например: мой первый файл (файл1) содержит данные:

Config:
Hostname = TUVALU

BT:
TS_Ball_Update_Threshold = 0.2

BT:
TS_Player_Search_Radius = 4

BT:
Ball_Template_Update = 0

а второй файл (файл2) содержит данные:

Pole_ID      = 2
Width        = 1280
Height       = 1024
Color_Mode   = 0
Sensor_Scale = 1

Tracking_ROI_Size = 4
Ball_Template_Update = 0

Если вы заметили, последние две строки каждого файла одинаковы, поэтому я хочу записать этот файл в файл FO. Но проблема с моим подходом заключается в том, что он также пишет общее пустое пространство. Должен ли я использовать регулярное выражение для этой проблемы? У меня нет опыта с регулярным выражением.

Ответ 1

Это решение считывает оба файла за один проход, исключает пустые строки и печатает общие строки независимо от их положения в файле:

with open('some_file_1.txt', 'r') as file1:
    with open('some_file_2.txt', 'r') as file2:
        same = set(file1).intersection(file2)

same.discard('\n')

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

Ответ 2

Еще один пример...

from __future__ import print_function #Only for Python2

with open('file1.txt') as f1, open('file2.txt') as f2, open('outfile.txt', 'w') as outfile:
    for line1, line2 in zip(f1, f2):
        if line1 == line2:
            print(line1, end='', file=outfile)

И если вы хотите удалить обычные пустые строки, просто измените оператор if на:

if line1.strip() and line1 == line2:

.strip() удаляет все начальные и конечные пробелы, поэтому, если все это в строке, оно станет пустой строкой "", которая считается ложной.

Ответ 3

После того, как объект файла итерируется, он exausted.

>>> f = open('1.txt', 'w')
>>> f.write('1\n2\n3\n')
>>> f.close()
>>> f = open('1.txt', 'r')
>>> for line in f: print line
...
1

2

3

# exausted, another iteration does not produce anything.
>>> for line in f: print line
...
>>>

Используйте file.seek (или закройте/откройте файл), чтобы перемотать файл:

>>> f.seek(0)
>>> for line in f: print line
...
1

2

3

Ответ 4

Если порядок сохранен между файлами, вы также можете выбрать difflib. Хотя результат Robᵩ является стандартом bona-fide для пересечений, на самом деле вы можете искать грубые различия:

from difflib import Differ

with open('cfg1.txt') as f1, open('cfg2.txt') as f2:
    differ = Differ()

    for line in differ.compare(f1.readlines(), f2.readlines()):
        if line.startswith(" "):
            print(line[2:], end="")

Тем не менее, это отличается от того, что вы просили (порядок важен), хотя в этом случае создается тот же результат.

Ответ 5

Я только что столкнулся с тем же вызовом, но я подумал: "Зачем программировать это на Python, если вы можете решить его с помощью простого" grep "?, что привело к следующему коду Python:

import subprocess
from subprocess import PIPE

try:
  output1, errors1 = subprocess.Popen(["c:\\cygwin\\bin\\grep", "-Fvf" ,"c:\\file1.txt", "c:\\file2.txt"], shell=True, stdout=PIPE, stderr=PIPE).communicate();
  output2, errors2 = subprocess.Popen(["c:\\cygwin\\bin\\grep", "-Fvf" ,"c:\\file2.txt", "c:\\file1.txt"], shell=True, stdout=PIPE, stderr=PIPE).communicate();
  if (len(output1) + len(output2) + len(errors1) + len(errors2) > 0):
    print ("Compare result : There are differences:");
    if (len(output1) + len(output2) > 0):
      print ("  Output differences : ");
      print (output1);
      print (output2);
    if (len(errors1) + len(errors2) > 0):
      print (" Errors : ");
      print (errors1);
      print (errors2);
  else:
    print ("Compare result : Both files are equal");
except Exception as ex:
  print("Compare result : Exception during comparison");
  print(ex);
  raise;

Трюк за этим заключается в следующем: grep -Fvf file1.txt file2.txt проверяет, присутствуют ли все файлы в файле2.txt в файле file1.txt. Делая это в обоих направлениях, мы можем видеть, является ли содержимое обоих файлов "равным". Я ставил "равный" между кавычками, потому что дублирующиеся строки не учитываются при этом.

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

Ответ 6

Попробуйте следующее:

from __future__ import with_statement

filename1 = "G:\\test1.TXT"
filename2 = "G:\\test2.TXT"


with open(filename1) as f1:
   with open(filename2) as f2:
      file1list = f1.read().splitlines()
      file2list = f2.read().splitlines()
      list1length = len(file1list)
      list2length = len(file2list)
      if list1length == list2length:
          for index in range(len(file1list)):
              if file1list[index] == file2list[index]:
                  print file1list[index] + "==" + file2list[index]
              else:                  
                  print file1list[index] + "!=" + file2list[index]+" Not-Equel"
      else:
          print "difference inthe size of the file and number of lines"