Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 9, 2012 19:39:45

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Счет строк из файла

s0rg
но это правило хорошего тона, открыл - закрой.
Согласен, потому и with open(…) в коде.

Офлайн

#2 Ноя. 9, 2012 19:47:31

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Счет строк из файла

s0rg
Конечно не будет - но это правило
хорошего тона, открыл - закрой.
Ну ладно, пусть reduce говнокод, но в том случае что закрывать? Или здесь: f = open(path).read() ? Тоже нечего, нет файлового объекта.

Офлайн

#3 Ноя. 9, 2012 20:10:21

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Счет строк из файла

dimy44
f = open(path).read()
f - это результат read() от _файлового объекта_ создаваемого в open(path)

Офлайн

#4 Ноя. 9, 2012 20:25:07

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Счет строк из файла

f здесь- строковой объект. Ссылки на открытый файл нет. Нет открытого файла.

f = open('D:\\1.txt')
f = open('D:\\1.txt', 'w') # IOError: [Errno 13] Permission denied: 'D:\\1.txt'
#...
f = open('D:\\1.txt').read()
f = open('D:\\1.txt', 'w') # Все ок.

Офлайн

#5 Ноя. 9, 2012 20:26:39

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Счет строк из файла

dimy44
Нет открытого файла.
А чтение происходит из астрального вакуума?

Офлайн

#6 Ноя. 9, 2012 20:33:19

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Счет строк из файла

Я не знаю тонкостей как там происходит, дабы не ошибиться, оставлю свои предположения при себе. Но пример выше показывает, что файл свободен.

Офлайн

#7 Ноя. 9, 2012 20:52:59

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Счет строк из файла

dimy44
Я не знаю тонкостей как там происходит
Твой код:
f = open('D:\\1.txt').read()
Полностью анологичен такому:
fd = open('D:\\1.txt')
f = fd.read()
Да - безусловно f будет строковым объектом но он получается в результате операции read() от файлового
объекта fd - который останется открытым пока его не соберет gc.
То есть в ‘хорошем’ варианте он бы выглядел так:
fd = open('D:\\1.txt')
f = fd.read()
fd.close() # он нам больше не нужен

Отредактировано s0rg (Ноя. 9, 2012 20:53:17)

Офлайн

#8 Ноя. 9, 2012 21:04:31

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Счет строк из файла

Мой код отличается от Вашего. У Вас создается переменная fd, занимающая ячейку в памяти и являющейся ссылкой на открытый файл. У меня этой переменной нет. Чтение происходит “на лету”, могу предположить, что файл закрывается автоматически по истечении работы read().

Офлайн

#9 Ноя. 9, 2012 21:41:48

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Счет строк из файла

Хрена он закроется. Если ты выполнил операцию open - сам он не закроется. Open работает в паре с close… Считывание происходит из файлового объекта, который засоряет память. Повторное обрашение к этому объекту (с другим параметром) приведет к ошибке… Дело не в том, закроет или нет (у тебя он будет весеть пока его не обработает сборщик мусора). Комманда with открывает файл, считывает с него информацию и сразу же закрывает. Эта информация и передается. Т.е. файловый дискриптор не весит в коде, ожидая, когда до него доберется сборщик или когда закончатся все ссылки на него…
Бывают, кстати, случаи, когда ты это же имя открытия припрятал в одной из ветвей (или в наследуемом объекте). При этом ссылки на него могут не закончится…. И он будет банально засирать память.

P.S. Насчет with - я ей не пользуюсь. Я всегда слежу за открытием и закрытием файла. При наступлении любой ошибки осуществляю попытку закрыть файл инструкцией try: file.close(), except: pass.
Поясню почему: Считывание информации функцией with может привести к ошибкам в коде. Нет явного открытия и закрытия файла. Если файл открыт и изменяется, то with может считывать из него информацию: я против этого, так как ценность такой информации сомнительна…



Отредактировано 4kpt (Ноя. 9, 2012 21:56:48)

Офлайн

#10 Ноя. 9, 2012 21:45:37

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Счет строк из файла

dimy44
могу предположить, что файл закрывается автоматически по истечении работы read().
Так и есть:
>>>text = open('text').read()
lsof | grep text
дескрипторов не находит

а вот если убрать read, он продолжает висеть в списке открытых
>>>open('text')

Отредактировано adray (Ноя. 9, 2012 21:55:23)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version