Найти - Пользователи
Полная версия: [Решено] Узнать позицию (оффсет) строки в файле
Начало » Python для новичков » [Решено] Узнать позицию (оффсет) строки в файле
1 2
Galvanize
Здравствуйте.
Имеется файл в несколько тысяч строк, в каждой строке по одному слову. Нужно найти определенное слово и узнать оффсет строки.
Файл вида:
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. Подскажите как решить проблему?
Спасибо.
FishHook
Вот эту строка
offset = urls.tell()-len(line)-1
запихайте внутрь цикла до break
Singularity
with open('data.txt') as а:
        for index, line in enumerate(а):
            if line == u'ppppp\n':
                break
                offset = index+1
             
        print offset
Galvanize
FishHook, увы, не помогло. Результат тот же.
Singularity, в Вашем случае выдало ошибку ‘offset is not defined’. Да и мне не номер строки нужен, а смещение для seek(offset,0)

В общем, назначение кода заключается в восстановлении работы программы после “сбоя”. На вход программы подается файл со множеством строк. Они обрабатываются, и нужные строки помещаются в другой выходной файл. Если работа программы прерывается, то мне нужно восстановить состоянии до прерывания: посмотреть последнюю строку в выходном файле, найти её во входном и указать методу seek() смещение к этой строке. С этой строки продолжить перебор.
dimy44
проверьте, выполняется ли break. Этого может не быть, если, скажем, перенос строки там
\r\n
Galvanize
dimy44, скорее всего дело не в этом, т.к. в условии if line == u'ppppp\n' кроме break определяется ещё и offset. Если бы условие не выполнялось, то print offset выдавал бы ошибку ‘offset’ undefined, но ошибки нет, и оффсет печатается, но к сожалению только на последнюю строку.
dimy44
ничего там, кроме break, нет в том блоке, посмотрите. А offset инициализируется после отработки цикла и в случае отсутсвия выполнения условия юзается последняя line
Galvanize
Да, Вы правы насчет того, что в блоке больше ничего нет. Я описал действия с кодом, который посоветовал FishHook. По сути ничего не изменится, и все произойдет так же.

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

Как выяснилось, при работе 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']

Всем отписавшимся в топе спасибо за отзывчивость.
dimy44
ага, вы уже сам разобрались, тогда добавлю, что еще нужно проверять на конец файла, вдруг не встретится строка искомая
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB