Найти - Пользователи
Полная версия: жрет ли память file.readline() ?
Начало » Python для новичков » жрет ли память file.readline() ?
1
Galvanize
Приветствую!
В огромнейшем файле (миллионы строк по одному слову) требуется найти нужную строку (find_string) перебором всех строк. Если искать таким образом, память не пострадает?
with open(filename) as f:
        while 1:
            if f.readline().strip() == find_string:
                #действия.
Singularity
readline не грузит весь файл в память.
Что будет в твоей коде когда файл закончится ? Ты выходишь с цикла когда нашел строку ?

Вот так проще и питоничней
with open(filename) as infile:
    for line in infile:
        do_something_with(line)
Galvanize
Да, как только нашли строку, выходим из цикла, получаем смещение к строке, и передаем его другой функции, которая будет читать следующие строки (f.next()) идущие после найденной. С for in не прокатит, т.к. это итератор, и поиск смещения в нем не работает.
Спасибо за ответ по readline().
py.user.next
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
>>>
Galvanize
py.user.next, вам не удастся определить смещение (file.tell()) в цикле for или in. Вернее сказать, при переборе строк файла через for, вы не сможете получить смещение на текущюю строку, т.к. оно будет указывать в конец файла.
Но спасибо за внимание.
doza_and
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
Budulianin
doza_and
ну может py.user.next не сможет, а почему я могу? Почему я получаю или Exception или позицию в файле, но никак не указатель на позицию конца файла?

Потому что, ты пользуешься Python 3.x, там такой проблемы нет
doza_and
Budulianin
Потому что, ты пользуешься Python 3.x
Обалдеть можно, сколько лет 2.x использую, а не замечал такого поведения. Спасибо!!!
py.user.next
Galvanize
py.user.next, вам не удастся определить смещение (file.tell()) в цикле for или in.
а, я просто не понял, про какое смещение речь, подумал, что про смещение по строкам

если особо приспичит, можешь свой файловый класс сделать, который работает, как надо
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