2013-03-24 2 views
1

У меня есть 2 файла в следующей форме:Сравнение 2 файлов построчно

file1: 
work1 
7 8 9 10 11 
1 2 3 4 5 
6 7 8 9 10 

file2: 
work2 
2 3 4 5 5 
2 4 7 8 9 
work1 
7 8 9 10 11 
1 2 4 4 5 
6 7 8 9 10 
work3 
1 7 8 9 10 

Теперь я хочу, чтобы сравнить файл и везде, где говорят, заголовок (работу1) является equal..I хотите сравнить последующее разделов и распечатать строку, в которой обнаружена разница. Например.

work1 (file1) 
7 8 9 10 11 
1 2 3 4 5 
6 7 8 9 10 

work1 (file2) 
7 8 9 10 11 
1 2 4 4 5 
6 7 8 9 10 

Теперь я хочу, чтобы напечатать строку, в которой разница происходит, т.е. "1 2 4 4 5"

для этого я написал следующий код:

with open("file1",) as r, open("file2") as w: 
    for line in r: 
     if "work1" in line: 
      for line1 in w: 
       if "work1" in line1: 
         print "work1" 

Однако отсюда Я смущен тем, как я могу прочитать оба файла параллельно. Может кто-то пожалуйста, помогите мне с этим ... как я не получаю после сравнения «work1» 's, как я должен читать файлы параллельно

+0

читайте оба в памяти (каждый r.read() и w.read() в переменную), затем выполните сравнение. Параллель - это не правильное слово. – CppLearner

+0

CppLearner Подход возможен только тогда, когда мои файлы не большие для больших файлов, подход невозможен – user1778824

+0

Хорошая точка. Ну, если вы уверены, что заголовок, такой как 'work1', не повторяется в том же файле, вы можете просто открыть файл и прочитать, где встречается и заканчивается подстрока, и возникает следующий заголовок. Запишите их в обоих файлах и затем прочитайте. Я не знаю, как производительность сравнивается с этим http://stackoverflow.com/questions/3322419/iterate-across-lines-in-two-files-simultaneous-in-python, который считывает оба файла в один и тот же итератор. – CppLearner

ответ

0
with open('f1.csv') as f1, open('f2.csv') as f2 : 
    i=0 
    break_needed = False 
    while True : 
     r1, r2 = f1.readline(), f2.readline() 
     if len(r1) == 0 : 
      print "eof found for f1" 
      break_needed = True 
     if len(r2) == 0 : 
      print "eof found for f2" 
      break_needed = True 
     if break_needed : 
      break 
     i += 1 
     if r1 != r2 : 
      print " line %i"%i 
      print "file 1 : " + r1 
      print "file 2 : " + r2 
1

Вы, вероятно, хотите попробовать itertools модуль в Python. Он содержит функцию под названием izip, которая может делать то, что вам нужно, а также функцию под названием islice. Вы можете перебирать второй файл, пока не нажмете на заголовок, который вы искали, и вы можете нарезать заголовок.

Вот немного кода.

from itertools import *  

w = open('file2') 
for (i,line) in enumerate(w): 
    if "work1" in line: 
    iter2 = islice(open('file2'), i, None, 1) # Starts at the correct line 

f = open('file1') 
for (line1,line2) in izip(f,iter2): 
    print line1, line2 # Place your comparisons of the two lines here. 

Теперь вам гарантировано, что при первом запуске цикла вы получите «work1» на обеих линиях. После этого вы можете сравнить. Так как f короче, чем w, итератор исчерпывает себя и останавливается, как только вы нажмете на конец f.

Надеюсь, я объяснил это хорошо.

EDIT: добавлен оператор импорта.

EDIT: нам нужно снова открыть файл2. Это связано с тем, что итерация через iterables в Python потребляет итерабельность. Итак, нам нужно передать новый номер islice, чтобы он работал!

+1

'islice (w, i, None, 1)' пропускает 'i' строки, начиная с текущей позиции в файле. –

+0

@AVP Спасибо за ответ ... не могли бы вы объяснить функцию «islice». На самом деле его выдача error..name 'islice' не определена. Также я импортировал itertools..если я не понимаю, почему это бросает ошибку – user1778824

+0

Вы делаете itertools.islice или вы делаете islice? Второй будет работать только в том случае, если ваш оператор импорта «из itertools import *», тогда как первый будет работать, когда вы будете «импортировать itertools». – AVP

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