[python] Как закрыть файл? (msg = open(file, 'r').read())

Модератор: Модераторы разделов

Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

[python] Как закрыть файл?

Сообщение Stauffenberg »

Всем привет!

Да, я знаю, что конструкция типа with open(file) as fd: намного интеллигентнее, но я работаю на машине со старым интерпретатором, который, как я понял, with еще не поддерживает.
Вот такой вопрос: читаем содержимое файла одной строкой, минуя прямое использование имени файлового дескриптора. Как в этом случае закрыть файл?

Код: Выделить всё

msg = open(file, 'r').read()

Всем спасибо
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: [python] Как закрыть файл?

Сообщение serzh-z »

Код: Выделить всё

file = open(file, 'r')
try:
    data = file.read()
finally:
    file.close()
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: [python] Как закрыть файл?

Сообщение Stauffenberg »

serzh-z писал(а):
17.06.2013 12:28

Код: Выделить всё

file = open(file, 'r')
try:
    data = file.read()
finally:
    file.close()

В этом случае file - дескриптор.

минуя прямое использование имени файлового дескриптора.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: [python] Как закрыть файл?

Сообщение serzh-z »

Stauffenberg
from __future__ import with_statement
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: [python] Как закрыть файл?

Сообщение Stauffenberg »

serzh-z писал(а):
17.06.2013 12:57
Stauffenberg
from __future__ import with_statement

ок, спасибо.

Но вопрос все же остается открытым. Через lsof мы можем увидеть, что соединение с файлом все еще не закрыто. Есть ли способ просмотреть все созданные объекты (включая те, на которые нет прямых ссылок), или объекты с типом file?
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: [python] Как закрыть файл?

Сообщение serzh-z »

Stauffenberg писал(а):
17.06.2013 15:35
Но вопрос все же остается открытым.
Не понял почему он открыт.

Есть три ответа:

- для версии 2.6+: with и file.close()
- для версии 2.5: from __future__ import with_statement
- для более старых версий Python: file.close(), либо ожидать, когда сборщик мусора сам вызовет деструктор объекта File. Говорят, что в CPython сборщик срабатывает сразу же после того, как счётчик ссылок на объект обнуляется

Про список объектов: может globals() поможет.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: [python] Как закрыть файл?

Сообщение serzh-z »

Stauffenberg писал(а):
17.06.2013 15:35
Есть ли способ просмотреть все созданные объекты (включая те, на которые нет прямых ссылок), или объекты с типом file?

Вот так можно отследить нужные объекты:

Код: Выделить всё

import gc

for f in [o for o in gc.get_objects() if isinstance(o, io.TextIOWrapper)]:
    print(f)
Спасибо сказали: