Форум сайта python.su
173
s0rgСогласен, потому и with open(…) в коде.
но это правило хорошего тона, открыл - закрой.
Офлайн
s0rgНу ладно, пусть reduce говнокод, но в том случае что закрывать? Или здесь: f = open(path).read() ? Тоже нечего, нет файлового объекта.
Конечно не будет - но это правило
хорошего тона, открыл - закрой.
Офлайн
25
dimy44f - это результат read() от _файлового объекта_ создаваемого в open(path)
f = open(path).read()
Офлайн
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') # Все ок.
Офлайн
25
dimy44А чтение происходит из астрального вакуума?
Нет открытого файла.
Офлайн
Я не знаю тонкостей как там происходит, дабы не ошибиться, оставлю свои предположения при себе. Но пример выше показывает, что файл свободен.
Офлайн
25
dimy44Твой код:
Я не знаю тонкостей как там происходит
f = open('D:\\1.txt').read()
fd = open('D:\\1.txt') f = fd.read()
fd = open('D:\\1.txt') f = fd.read() fd.close() # он нам больше не нужен
Отредактировано s0rg (Ноя. 9, 2012 20:53:17)
Офлайн
Мой код отличается от Вашего. У Вас создается переменная fd, занимающая ячейку в памяти и являющейся ссылкой на открытый файл. У меня этой переменной нет. Чтение происходит “на лету”, могу предположить, что файл закрывается автоматически по истечении работы read().
Офлайн
63
Хрена он закроется. Если ты выполнил операцию open - сам он не закроется. Open работает в паре с close… Считывание происходит из файлового объекта, который засоряет память. Повторное обрашение к этому объекту (с другим параметром) приведет к ошибке… Дело не в том, закроет или нет (у тебя он будет весеть пока его не обработает сборщик мусора). Комманда with открывает файл, считывает с него информацию и сразу же закрывает. Эта информация и передается. Т.е. файловый дискриптор не весит в коде, ожидая, когда до него доберется сборщик или когда закончатся все ссылки на него…
Бывают, кстати, случаи, когда ты это же имя открытия припрятал в одной из ветвей (или в наследуемом объекте). При этом ссылки на него могут не закончится…. И он будет банально засирать память.
P.S. Насчет with - я ей не пользуюсь. Я всегда слежу за открытием и закрытием файла. При наступлении любой ошибки осуществляю попытку закрыть файл инструкцией try: file.close(), except: pass.
Поясню почему: Считывание информации функцией with может привести к ошибкам в коде. Нет явного открытия и закрытия файла. Если файл открыт и изменяется, то with может считывать из него информацию: я против этого, так как ценность такой информации сомнительна…
Отредактировано 4kpt (Ноя. 9, 2012 21:56:48)
Офлайн
18
dimy44Так и есть:
могу предположить, что файл закрывается автоматически по истечении работы read().
>>>text = open('text').read()
lsof | grep text
>>>open('text')
Отредактировано adray (Ноя. 9, 2012 21:55:23)
Офлайн