Форум сайта python.su
0
Здравствуйте.
Имеется файл в несколько тысяч строк, в каждой строке по одному слову. Нужно найти определенное слово и узнать оффсет строки.
Файл вида:
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
Отредактировано Galvanize (Ноя. 25, 2013 19:55:21)
Офлайн
568
Вот эту строка
offset = urls.tell()-len(line)-1
Офлайн
75
with open('data.txt') as а: for index, line in enumerate(а): if line == u'ppppp\n': break offset = index+1 print offset
Офлайн
0
FishHook, увы, не помогло. Результат тот же.
Singularity, в Вашем случае выдало ошибку ‘offset is not defined’. Да и мне не номер строки нужен, а смещение для seek(offset,0)
В общем, назначение кода заключается в восстановлении работы программы после “сбоя”. На вход программы подается файл со множеством строк. Они обрабатываются, и нужные строки помещаются в другой выходной файл. Если работа программы прерывается, то мне нужно восстановить состоянии до прерывания: посмотреть последнюю строку в выходном файле, найти её во входном и указать методу seek() смещение к этой строке. С этой строки продолжить перебор.
Отредактировано Galvanize (Ноя. 25, 2013 17:19:43)
Офлайн
проверьте, выполняется ли break. Этого может не быть, если, скажем, перенос строки там
\r\n
Офлайн
0
dimy44, скорее всего дело не в этом, т.к. в условии if line == u'ppppp\n' кроме break определяется ещё и offset. Если бы условие не выполнялось, то print offset выдавал бы ошибку ‘offset’ undefined, но ошибки нет, и оффсет печатается, но к сожалению только на последнюю строку.
Офлайн
ничего там, кроме break, нет в том блоке, посмотрите. А offset инициализируется после отработки цикла и в случае отсутсвия выполнения условия юзается последняя line
Офлайн
0
Да, Вы правы насчет того, что в блоке больше ничего нет. Я описал действия с кодом, который посоветовал FishHook. По сути ничего не изменится, и все произойдет так же.
Отредактировано Galvanize (Ноя. 25, 2013 18:25:12)
Офлайн
0
В общем, сам решил проблему.
Как выяснилось, при работе for c дескриптором файла, он (for) перед тем как пройтись по строкам производит какие-то манипуляции (предположительно, преобразует в список), после которых указатель на текущую позицию в файле оказывается в конце, и работа цикла в дальнейшем происходит с полученным списком, а не с самим дескриптором. Такое же поведение присуще и конструкции
if 'string' in file
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()
['NEWNEWNEW\n', 'NEWNEWNEW1\n', 'NEWNEWNEW2\n', 'NEWNEWNEW3\n', 'NEWNEWNEW4']
Отредактировано Galvanize (Ноя. 25, 2013 19:05:25)
Офлайн
ага, вы уже сам разобрались, тогда добавлю, что еще нужно проверять на конец файла, вдруг не встретится строка искомая
Отредактировано dimy44 (Ноя. 25, 2013 19:13:04)
Офлайн