Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 25, 2013 16:48:09

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Узнать позицию (оффсет) строки в файле

Здравствуйте.
Имеется файл в несколько тысяч строк, в каждой строке по одному слову. Нужно найти определенное слово и узнать оффсет строки.
Файл вида:
aaaaa
bbbbb
ccccc
ppppp
ddddd
qqqqq

with open('data.txt') as а:
        for line in а:
            if line == u'ppppp\n':
                break
        offset = urls.tell()-len(line)-1
             
        print offset
Несмотря на break, выдает оффсет последней строки. Подозреваю, что дело в работе цикла for. Подскажите как решить проблему?
Спасибо.



Отредактировано Galvanize (Ноя. 25, 2013 19:55:21)

Офлайн

#2 Ноя. 25, 2013 16:53:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

[Решено] Узнать позицию (оффсет) строки в файле

Вот эту строка

offset = urls.tell()-len(line)-1
запихайте внутрь цикла до break



Офлайн

#3 Ноя. 25, 2013 16:59:23

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

[Решено] Узнать позицию (оффсет) строки в файле

with open('data.txt') as а:
        for index, line in enumerate(а):
            if line == u'ppppp\n':
                break
                offset = index+1
             
        print offset

Офлайн

#4 Ноя. 25, 2013 16:59:49

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Узнать позицию (оффсет) строки в файле

FishHook, увы, не помогло. Результат тот же.
Singularity, в Вашем случае выдало ошибку ‘offset is not defined’. Да и мне не номер строки нужен, а смещение для seek(offset,0)

В общем, назначение кода заключается в восстановлении работы программы после “сбоя”. На вход программы подается файл со множеством строк. Они обрабатываются, и нужные строки помещаются в другой выходной файл. Если работа программы прерывается, то мне нужно восстановить состоянии до прерывания: посмотреть последнюю строку в выходном файле, найти её во входном и указать методу seek() смещение к этой строке. С этой строки продолжить перебор.



Отредактировано Galvanize (Ноя. 25, 2013 17:19:43)

Офлайн

#5 Ноя. 25, 2013 17:40:16

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

[Решено] Узнать позицию (оффсет) строки в файле

проверьте, выполняется ли break. Этого может не быть, если, скажем, перенос строки там

\r\n

Офлайн

#6 Ноя. 25, 2013 17:53:14

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Узнать позицию (оффсет) строки в файле

dimy44, скорее всего дело не в этом, т.к. в условии if line == u'ppppp\n' кроме break определяется ещё и offset. Если бы условие не выполнялось, то print offset выдавал бы ошибку ‘offset’ undefined, но ошибки нет, и оффсет печатается, но к сожалению только на последнюю строку.



Офлайн

#7 Ноя. 25, 2013 18:06:33

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

[Решено] Узнать позицию (оффсет) строки в файле

ничего там, кроме break, нет в том блоке, посмотрите. А offset инициализируется после отработки цикла и в случае отсутсвия выполнения условия юзается последняя line

Офлайн

#8 Ноя. 25, 2013 18:20:45

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Узнать позицию (оффсет) строки в файле

Да, Вы правы насчет того, что в блоке больше ничего нет. Я описал действия с кодом, который посоветовал FishHook. По сути ничего не изменится, и все произойдет так же.



Отредактировано Galvanize (Ноя. 25, 2013 18:25:12)

Офлайн

#9 Ноя. 25, 2013 19:02:17

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[Решено] Узнать позицию (оффсет) строки в файле

В общем, сам решил проблему.

Как выяснилось, при работе for c дескриптором файла, он (for) перед тем как пройтись по строкам производит какие-то манипуляции (предположительно, преобразует в список), после которых указатель на текущую позицию в файле оказывается в конце, и работа цикла в дальнейшем происходит с полученным списком, а не с самим дескриптором. Такое же поведение присуще и конструкции

if 'string' in file

Вот полное решение. В данном примере работа происходит с одним файлом, но это сути не меняет.
Содержимое data.txt:
aaaaa
bbbbb
ccccc
ddddd
eeeee
fffff
ggggg
hhhhh
kkkkk
lllll
mmmmm
nnnnn
ooooo
ppppp
NEWNEWNEW
NEWNEWNEW1
NEWNEWNEW2
NEWNEWNEW3
NEWNEWNEW4

find_string = 'ppppp\n'
with open('data.txt', 'r') as urls:
        while 1:
            if urls.readline() == find_string:
                offset_to_next_string = urls.tell()
                break
        
with open('data.txt','r') as newfile:
    newfile.seek(offset_to_next_string,0)
    print newfile.readlines()
При первом открытии происходит поиск смещения строки find_string
При втором открытии мы перемещаем указатель на следующую после find_string строку, и выводим данные после find_string.

На выходе получим список
['NEWNEWNEW\n', 'NEWNEWNEW1\n', 'NEWNEWNEW2\n', 'NEWNEWNEW3\n', 'NEWNEWNEW4']

Всем отписавшимся в топе спасибо за отзывчивость.



Отредактировано Galvanize (Ноя. 25, 2013 19:05:25)

Офлайн

#10 Ноя. 25, 2013 19:10:30

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

[Решено] Узнать позицию (оффсет) строки в файле

ага, вы уже сам разобрались, тогда добавлю, что еще нужно проверять на конец файла, вдруг не встретится строка искомая

Отредактировано dimy44 (Ноя. 25, 2013 19:13:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version