Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 28, 2013 23:33:35

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

жрет ли память file.readline() ?

Приветствую!
В огромнейшем файле (миллионы строк по одному слову) требуется найти нужную строку (find_string) перебором всех строк. Если искать таким образом, память не пострадает?

with open(filename) as f:
        while 1:
            if f.readline().strip() == find_string:
                #действия.



Отредактировано Galvanize (Ноя. 29, 2013 01:38:03)

Офлайн

#2 Ноя. 29, 2013 04:11:23

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

жрет ли память file.readline() ?

readline не грузит весь файл в память.
Что будет в твоей коде когда файл закончится ? Ты выходишь с цикла когда нашел строку ?

Вот так проще и питоничней

with open(filename) as infile:
    for line in infile:
        do_something_with(line)

Офлайн

#3 Ноя. 29, 2013 12:09:06

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

жрет ли память file.readline() ?

Да, как только нашли строку, выходим из цикла, получаем смещение к строке, и передаем его другой функции, которая будет читать следующие строки (f.next()) идущие после найденной. С for in не прокатит, т.к. это итератор, и поиск смещения в нем не работает.
Спасибо за ответ по readline().



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

Офлайн

#4 Ноя. 29, 2013 20:40:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9865
Репутация: +  853  -
Профиль   Отправить e-mail  

жрет ли память file.readline() ?

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
>>>



Офлайн

#5 Ноя. 30, 2013 03:09:31

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

жрет ли память file.readline() ?

py.user.next, вам не удастся определить смещение (file.tell()) в цикле for или in. Вернее сказать, при переборе строк файла через for, вы не сможете получить смещение на текущюю строку, т.к. оно будет указывать в конец файла.
Но спасибо за внимание.



Отредактировано Galvanize (Ноя. 30, 2013 03:15:37)

Офлайн

#6 Ноя. 30, 2013 14:25:16

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

жрет ли память file.readline() ?

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



Офлайн

#7 Ноя. 30, 2013 17:43:47

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

жрет ли память file.readline() ?

doza_and
ну может py.user.next не сможет, а почему я могу? Почему я получаю или Exception или позицию в файле, но никак не указатель на позицию конца файла?

Потому что, ты пользуешься Python 3.x, там такой проблемы нет



Офлайн

#8 Ноя. 30, 2013 17:53:27

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

жрет ли память file.readline() ?

Budulianin
Потому что, ты пользуешься Python 3.x
Обалдеть можно, сколько лет 2.x использую, а не замечал такого поведения. Спасибо!!!



Офлайн

#9 Ноя. 30, 2013 20:22:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9865
Репутация: +  853  -
Профиль   Отправить e-mail  

жрет ли память file.readline() ?

Galvanize
py.user.next, вам не удастся определить смещение (file.tell()) в цикле for или in.
а, я просто не понял, про какое смещение речь, подумал, что про смещение по строкам

если особо приспичит, можешь свой файловый класс сделать, который работает, как надо



Отредактировано py.user.next (Ноя. 30, 2013 20:23:30)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version