2013-12-18 2 views
-3

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

В этом file1.txt данные от 736.199070736: до 0x000a00f5) делают это в одной строке. Он придет, как этот

736.199070736: LOG_MOD_L0_RECEIVE_TXBRP_CONTROL(0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5). 

И file2.txt первая строка:

736.199047132: LOG_TXBP_MOD_IF_RSP_DPCCH(BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5) 

Так с первой линии обоих этих файлов: Я хочу, чтобы сравнить данные из первой строки file1.txt (0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5)

и данные из первой строки file2.txt (BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5)

Мне нужно удалить BlockNum: текст, а затем сравнить.

FILE1.TXT, который содержит:

736.199070736: LOG_MOD_L0_RECEIVE_TXBRP_CONTROL(0, 
0x0075007f, 
0x005500dd, 
0x007f00d7, 
0x0057005f, 
0x00ff007d, 
0x00f700dd, 
0x00f50057, 
0x000a00f5) 
736.209069960: LOG_MOD_L0_RECEIVE_TXBRP_CONTROL(0, 
0x0075007b, 
0x005500dd, 
0x007f00d7, 
0x0057005f, 
0x00ff007d, 
0x00f700dd, 
0x00f50057, 
0x000a00f1) 

'file2.txt' содержит:

736.199047132: LOG_TXBP_MOD_IF_RSP_DPCCH(BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5) 
736.209044558: LOG_TXBP_MOD_IF_RSP_DPCCH(BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5) 

Мой код:

fin1=open("file1.txt","r") 
fin2=open("file2.txt","r") 
    for line1 in fin1: 
     for line2 in fin2: 
     if line==line2: 
      print "same data" 
     else: 
      print "data are different" 

Это не сравниваю правильно, что я хочу в точку.

+0

Не могли бы вы правильно отформатировать вопрос? – thefourtheye

+0

Нет, это не так. Это отличный вопрос. Обращайтесь с вопросом правильно. – user3082400

+0

. Я дал вам ответ в вашем вопросе по обработке строк (http://stackoverflow.com/questions/20661416/how-to-print-specific-strings- в-питон); вы должны действительно попытаться экстраполировать такие ответы. Кажется, вы перенаправляете каждую проблему на ответы «Переполнение стека» без каких-либо усилий, чтобы сначала изучить несколько новых строковых методов. –

ответ

1

Что я понимаю из вашего кода, это сравнение первой строки файла1 со всеми строками в файле2.

Что вы на самом деле хотите сделать, это прочитать строку в файле1, сравнить ее с файлом2, если она отличается от другой, и заканчивать. В противном случае завершите сравнение всех строк и верните их равными.

Мне не нравятся ответы в how to compare lines in two files are same or different in python, так как они загружают все файлы в памяти.

Что я хотел бы сделать что-то вроде

f1 = open("file1") 
f2 = open("file2") 
line1 = next(f1) 
line2 = next(f2) 
found_different = False 
while line1 and line2: 
    if line1 != line2: 
     found_different = True 
     break 
    line1 = next(f1) 
    line2 = next(f2) 

if not line1 and not line2 and not found_different: 
    print "equal" 
else: 
    print "different" 
+0

нет no.in файл1 данных нет (0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5) и в file2 данных (0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057 , 0x000a00f5). Здесь я удалил «BlockNum:». Затем мне нужно сравнить оба этих данных: – user3082400

+0

, если u выровнять мой вопрос u может понять это лучше – user3082400

+0

Oooh спасибо за это. Я сравниваю три текстовых файла (генома) по очереди, и это намного лучшее решение, чем чтение всего в память. –

0

Ваша проблема заключается в том, что в вашем втором for цикле, вы говорите:

if line==line2: 

Когда это должно быть:

if line1==line2: 

Поскольку он не знает, что такое line, вы получаете ошибки. Вот исправленный код после тестирования.

fin1=open("file1.txt","r") 
fin2=open("file2.txt","r") 
for line1 in fin1: 
    for line2 in fin2: 
     if line1==line2: 
      print "same data" 
     else: 
      print "data are different" 
fin1.close() 
fin2.close() 

Счастливое кодирование!

+0

no no.Что я точно хочу в первом файле берут эти данные отдельно (0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5) и опустить этот текст «736.199070736: LOG_MOD_L0_RECEIVE_TXBRP_CONTROL» и аналогично этому данные из (BlockNum: 0, 0x0075007f, 0x005500dd, 0x007f00d7, 0x0057005f, 0x00ff007d, 0x00f700dd, 0x00f50057, 0x000a00f5). В этом удалите «BlockNum:», а затем сравните обе эти данные ?? – user3082400

+0

Обязательно прочитайте систему разметки StackOverflow, чтобы ваши сообщения выглядели более презентабельными в будущем. – jwarner112

+0

@ user3082400 Когда я редактировал ваш вопрос, я удалил некоторые детали. Я просто вернул их, дайте мне знать, правильно ли я их исправил. В вашем последнем изменении эти данные все еще исчезли, и мне нужно знать, что внутри ваших скобок кода текст читается точно так же, как файлы file.txt, потому что имеет значение форматирование строк. – jwarner112

1

Не просто читайте файлы по строкам, но фильтруйте каждую строку: извлеките материал в пределах () и удалите BlockNum:, если он существует. Что-то вроде этого:

def getRecords(fn): 
    for line in open(fn, 'r'): 
     entry = line.rstrip()[line.find('(')+1:-1] 
     if entry.startswith('BlockNum:'): 
      yield entry[10:] 
     else: 
      yield entry 

import itertools 
filesAreEqual = all(a == b for a, b in itertools.izip(getRecords("file1.txt"), 
                 getRecords("file2.txt"))) 
+0

это нормально. Но мы не можем жестко закодировать этот скрипт, как если entry.startswith ('BlockNum:'): и введите запись [10: -1]. Потому что эта строка будет меняться всегда. – user3082400

+0

@ user3082400 Вам нужно сделать свой вопрос более надежным. Включите контекст и используйте в своем скрипте. Объясните нам, как * линии могут измениться. Имейте в виду, что для любого возможного способа написания ваших строк могут быть * десять способов чтения, каждый из которых помогает вам по-другому и может не работать по всем направлениям. Так помогите нам помочь вам. – jwarner112

+0

@ user3082400 Если строка 'BlockNum' будет отличаться, просто пропустите все до (включая)': '. –

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