2013-11-21 4 views
0

У меня есть файл, который выглядит следующим образом (только малая часть):Найти номер строки фразы в файле

õ õ ø   ø õ ø   ø ø ø   ø ø ø   ø ø ø   ø ø Øó   ø Øó Ùó   õ  Ïó ø   ø Ïó Ðó   ø Ðó ø   ø Ðó Öó   ø Öó Øó   rö sö ø   ø sö ø   ø ø ø   ø ø ø   ø ø ø   ø ø ø   ø ø !ø   !ø ø "ø   !ø "ø #ø   #ø "ø $ø   #ø $ø %ø   %ø $ø &ø   %ø &ø 'ø   'ø &ø (ø   'ø (ø)ø  )ø (ø *ø  )ø *ø +ø   +ø *ø ,ø   +ø ,ø -ø   -ø ,ø .ø   -ø .ø /ø   /ø .ø 0ø   /ø 0ø 1ø   1ø 0ø 2ø   1ø 2ø 3ø   3ø 2ø 4ø   3ø 4ø 5ø   5ø 4ø 6ø   5ø 6ø 7ø   7ø 6ø 8ø   7ø 8ø 9ø   9ø 8ø :ø   9ø :ø ;ø   ;ø :ø <ø   ;ø <ø =ø   =ø <ø >ø  ) 
End of Binary Section 2013)  
(0 "Zone variables:") 

Я нашел фрагмент кода, который выглядит следующим образом:

f = open('D:/bat_new.msh','rb') 
line_num = 0 
search_phrase = '(0 "Zone variables:")' 

for line in f.readlines(): 
    line_num += 1 
    if line.find(search_phrase) >= 0: 
     print line_num 

Когда я запускаю над фрагментом, я получаю номер строки 30308, но если я открою файл в Notepad ++, номер строки будет равен 60533.

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

В конечном счете, я хочу пропустить чтение над этой строкой и только прочитать записи ниже.

+0

'find' возвращает самый низкий индекс, который находит данную фразу. Таким образом, вам не нужно выполнять итерацию по линиям с помощью цикла for. – sdasdadas

+0

, вероятно, у вас есть '(0" Зонные переменные: ")' в строке 30308; могут ли ваши данные записываться с небольшими изменениями дважды, так как 30308 составляет примерно 60533/2? – alko

+0

Возможно, что это текстовый файл Windows (за исключением двоичных битов), поэтому приложения Windows, такие как Notepad ++, учитывают только строки Windows, то есть '\ r \ n', а ваш код, который открывает файл в двоичном режиме , подсчитывает все исходные строки, то есть '\ n'. Итак, если есть 30308 '\ r \ n' плюс еще 30225 '\ n' без' \ r', это именно то, что вы найдете. – abarnert

ответ

1

Без фактического доступа к файлу нет возможности рассказать вам, что происходит, кроме как догадываться.

Но у меня есть предположение, что я бы дал около 2: 1.

Текстовые файлы Windows используют двухсимвольную последовательность \r\n для строк новой строки. Файлы двоичного режима Python используют односимвольную последовательность \n.

Когда вы имеете дело с реальными текстовыми файлами, это не делает большой разницы, если вы считаете это неправильно, каждый \r\n ровно один \n, и там не будет никаких других \n символов в файле, так вы получите тот же счет, что и Notepad ++.

Но ваши файлы имеют встроенные двоичные данные. Если данные были полностью случайными, 1/256-й из символов был бы голым \n, но только 1/65536th из двухсимвольных последовательностей будет \r\n. Очевидно, что из вашего фрагмента данные не являются полностью случайными. Но по-прежнему вероятно, что ваш код найдет намного больше \n символов, чем Notepad ++ найдет \r\n последовательностей.

+0

Согласен с вопросом '' \ r \ n''. – jdotjdot

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