Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 9, 2012 21:55:23

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

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

Вы что издеваетесь. Я вам же написал. Если на файл больше нет ссылок(файловый дискриптор, почти как переменная) - он естественно удаляется. Если файл имеет ссылки (где-то в программе тоже использовали такое название, которое должно было сработать, если…..), то он будет висеть…



Офлайн

#2 Ноя. 9, 2012 21:58:51

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

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

4kpt
Вы что издеваетесь. Я вам же написал. Если на файл больше нет ссылок(файловый дискриптор, почти как переменная) - он естественно удаляется. Если файл имеет ссылки (где-то в программе тоже использовали такое название, которое должно было сработать, если…..), то он будет висеть…
См. фикс. Скорее всего дело в .read(), которая закрывает файл по завершении чтения

не, хуйня.

код создает файловый объект:
open('file')
где в программе он хранится и почему не удаляется gc?

Отредактировано adray (Ноя. 9, 2012 22:05:09)

Офлайн

#3 Ноя. 9, 2012 22:15:22

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

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

Попробовал. Получается, что правда. Файловый дискриптор не создается. Потому как нет прямой ссылки на файл… Буду теперь пользоваться. Хотя, не, наверное не буду. Привычка, как говорится. Привык отслеживать состояние данных в файле и методы его открытия, закрытия. Кроме того, такой инструкцией не откроешь файл для чтения и записи одновременно….



Отредактировано 4kpt (Ноя. 9, 2012 22:23:15)

Офлайн

#4 Ноя. 9, 2012 23:04:57

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

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

Ну, как всегда: “начали про Фому, закончили про Ерему”). Я все время так читаю из файла при необходимости, от ситуации зависит, выглядет читабельно, никаких побочных эффектов не наблюдал до сих пор. Да и у Россума в учебнике есть такие строки в примере(ах).

Офлайн

#5 Ноя. 9, 2012 23:07:04

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

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

Я проверил у себя - Python 2.7.1+ (r271:86832, Sep 27 2012, 21:16:52)
И подтверждаю такое поведение - после read() файла нет, но блин это же странно:
Objects/fileobject.c:1041 static PyObject *file_read(PyFileObject *f, PyObject *args)
(я так понимаю что именно эта часть отвечает за файловые объекты) - ну нет там указание на принудительное закрытие (либо я его проморгал).
Да и в доке ничего про такое поведение не говорится.

Офлайн

#6 Ноя. 9, 2012 23:08:33

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

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

Я тоже искал, где происходит явное закрытие открытого дискриптора и не нашел… Странно. Но надо учесть.



Офлайн

#7 Ноя. 9, 2012 23:11:32

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

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

Причем, он закрывается даже после gc.disable()

Офлайн

#8 Ноя. 10, 2012 00:08:58

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

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

Пичаль… и эти люди дают советы по Python.

Начнем с того что Python в первую очередь опирается на механизм подсчета ссылок. GC работает когда есть циклические ссылки и простой подсчет ссылок уже не срабатывает. (Андрей Светлов, поправь если что не так)

По поводу как работать с файлами. Правильно сказали, что с файлами нужно работать через with.

Да это правда что в конструкции

open('filename').read()

Файл скорей всего будет закрыт сразу после выполнения метода read, так как создастся временная ссылка, которая сразу же после выполнения read будет уничтожена и соответственно файл закрывается если можно так выразиться в деструкторе.

Но это еще не самое забавное.

def foo():
    fd = open('filename')
    fd.read()

В какой момент закроется файл? Ответ: неизвестно.
В большинстве случаев вы могли бы расчитывать на то, что файл будет закрыт по выходу из функции foo.
И это будет работать. Так как функции ограничивают область видимости, все локальные ссылки по выходу из них уничтожаются. У fd был счетчик ссылок 1, стал 0, файл закрылся.

И все сказочно до тех пор, пока из функции не будет выброшено исключение.
Исключение хранит ссылку на тот фрейм из которого оно было выброшено. Будет ли закрыт файл?
Кстати поведение для Python 2.x и 3.x может отличаться.

Вывод: ВСЕГДА для ресурсов, которые требуют ручного освобождения использовать конструкцию with если сие позволяет интерфейс. НИКОГДА не надеяться на сборщик мусора или подсчет ссылок.



Отредактировано cutwater (Ноя. 10, 2012 00:16:07)

Офлайн

#9 Ноя. 10, 2012 00:12:56

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

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

dimy44
или так
sum_ = reduce(lambda x, y: int(x) + int(y), open(path_to_file))
Ака s0rg-а?

Народ, я писал свой код в рассчете на то, что это будет вся программа и файл закроется при выходе из питона.

Файл закрывается, когда открытый файловый обьект съедается GC, но этот процесс недетерминирован, т.е. он может произойти в абсолютно любой момент, а может и не произойти вообще до закрытия программы, поэтому рассчитывать на это нельзя.

Офлайн

#10 Ноя. 10, 2012 00:28:21

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

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

cutwater
odnochlen

s0rg
Причем, он закрывается даже после gc.disable()
То есть:
import gc
gc.disable()
a = open('somefile').read()
Тоже самое.
Или циклические ссылки и gc у питона это два разных механизма?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version