Найти - Пользователи
Полная версия: Счет строк из файла
Начало » Python для новичков » Счет строк из файла
1 2 3 4 5 6
reclosedev
s0rg
но это правило хорошего тона, открыл - закрой.
Согласен, потому и with open(…) в коде.
dimy44
s0rg
Конечно не будет - но это правило
хорошего тона, открыл - закрой.
Ну ладно, пусть reduce говнокод, но в том случае что закрывать? Или здесь: f = open(path).read() ? Тоже нечего, нет файлового объекта.
s0rg
dimy44
f = open(path).read()
f - это результат read() от _файлового объекта_ создаваемого в open(path)
dimy44
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') # Все ок.
s0rg
dimy44
Нет открытого файла.
А чтение происходит из астрального вакуума?
dimy44
Я не знаю тонкостей как там происходит, дабы не ошибиться, оставлю свои предположения при себе. Но пример выше показывает, что файл свободен.
s0rg
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() # он нам больше не нужен
dimy44
Мой код отличается от Вашего. У Вас создается переменная fd, занимающая ячейку в памяти и являющейся ссылкой на открытый файл. У меня этой переменной нет. Чтение происходит “на лету”, могу предположить, что файл закрывается автоматически по истечении работы read().
4kpt
Хрена он закроется. Если ты выполнил операцию open - сам он не закроется. Open работает в паре с close… Считывание происходит из файлового объекта, который засоряет память. Повторное обрашение к этому объекту (с другим параметром) приведет к ошибке… Дело не в том, закроет или нет (у тебя он будет весеть пока его не обработает сборщик мусора). Комманда with открывает файл, считывает с него информацию и сразу же закрывает. Эта информация и передается. Т.е. файловый дискриптор не весит в коде, ожидая, когда до него доберется сборщик или когда закончатся все ссылки на него…
Бывают, кстати, случаи, когда ты это же имя открытия припрятал в одной из ветвей (или в наследуемом объекте). При этом ссылки на него могут не закончится…. И он будет банально засирать память.

P.S. Насчет with - я ей не пользуюсь. Я всегда слежу за открытием и закрытием файла. При наступлении любой ошибки осуществляю попытку закрыть файл инструкцией try: file.close(), except: pass.
Поясню почему: Считывание информации функцией with может привести к ошибкам в коде. Нет явного открытия и закрытия файла. Если файл открыт и изменяется, то with может считывать из него информацию: я против этого, так как ценность такой информации сомнительна…
adray
dimy44
могу предположить, что файл закрывается автоматически по истечении работы read().
Так и есть:
>>>text = open('text').read()
lsof | grep text
дескрипторов не находит

а вот если убрать read, он продолжает висеть в списке открытых
>>>open('text')
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