Форум сайта python.su
Приветствую!
В огромнейшем файле (миллионы строк по одному слову) требуется найти нужную строку (find_string) перебором всех строк. Если искать таким образом, память не пострадает?
with open(filename) as f: while 1: if f.readline().strip() == find_string: #действия.
Отредактировано Galvanize (Ноя. 29, 2013 01:38:03)
Офлайн
readline не грузит весь файл в память.
Что будет в твоей коде когда файл закончится ? Ты выходишь с цикла когда нашел строку ?
Вот так проще и питоничней
with open(filename) as infile: for line in infile: do_something_with(line)
Офлайн
Да, как только нашли строку, выходим из цикла, получаем смещение к строке, и передаем его другой функции, которая будет читать следующие строки (f.next()) идущие после найденной. С for in не прокатит, т.к. это итератор, и поиск смещения в нем не работает.
Спасибо за ответ по readline().
Отредактировано Galvanize (Ноя. 29, 2013 12:14:27)
Офлайн
Galvanizeчего ?
С for in не прокатит, т.к. это итератор, и поиск смещения в нем не работает.
Galvanize
как только нашли строку, выходим из цикла, получаем смещение к строке, и передаем его другой функции, которая будет читать следующие строки (f.next()) идущие после найденной.
>>> with open('/etc/passwd', encoding='utf-8') as fin: ... for line in fin: ... print(line, end='') ... if line.startswith('root'): ... break ... print('sep') ... print(next(fin), end='') ... root:x:0:0:root:/root:/bin/bash sep bin:x:1:1:bin:/bin:/sbin/nologin >>>
Офлайн
py.user.next, вам не удастся определить смещение (file.tell()) в цикле for или in. Вернее сказать, при переборе строк файла через for, вы не сможете получить смещение на текущюю строку, т.к. оно будет указывать в конец файла.
Но спасибо за внимание.
Отредактировано Galvanize (Ноя. 30, 2013 03:15:37)
Офлайн
Galvanizeну может py.user.next не сможет, а почему я могу? Почему я получаю или Exception или позицию в файле, но никак не указатель на позицию конца файла?
вы не сможете получить смещение на текущюю строку, т.к. оно будет указывать в конец файла.
with open("a.dat","rb") as f: for i in f: print("{0}:{1}".format(f.tell(),i)) >>> 2:b'1\n' 4:b'2\n' 6:b'3\n' 8:b'4\n' 10:b'5\n' 11:b'6' with open("a.dat","r",encoding="utf8") as f: for i in f: print("{0}:{1}".format(f.tell(),i)) >>> Traceback (most recent call last): File "<string>", line 301, in runcode File "<editor selection>", line 3, in <module> OSError: telling position disabled by next() call
Офлайн
doza_and
ну может py.user.next не сможет, а почему я могу? Почему я получаю или Exception или позицию в файле, но никак не указатель на позицию конца файла?
Офлайн
BudulianinОбалдеть можно, сколько лет 2.x использую, а не замечал такого поведения. Спасибо!!!
Потому что, ты пользуешься Python 3.x
Офлайн
Galvanizeа, я просто не понял, про какое смещение речь, подумал, что про смещение по строкам
py.user.next, вам не удастся определить смещение (file.tell()) в цикле for или in.
Отредактировано py.user.next (Ноя. 30, 2013 20:23:30)
Офлайн