Найти - Пользователи
Полная версия: Счет строк из файла
Начало » Python для новичков » Счет строк из файла
1 2 3 4 5 6
4kpt
Вы что издеваетесь. Я вам же написал. Если на файл больше нет ссылок(файловый дискриптор, почти как переменная) - он естественно удаляется. Если файл имеет ссылки (где-то в программе тоже использовали такое название, которое должно было сработать, если…..), то он будет висеть…
adray
4kpt
Вы что издеваетесь. Я вам же написал. Если на файл больше нет ссылок(файловый дискриптор, почти как переменная) - он естественно удаляется. Если файл имеет ссылки (где-то в программе тоже использовали такое название, которое должно было сработать, если…..), то он будет висеть…
См. фикс. Скорее всего дело в .read(), которая закрывает файл по завершении чтения

не, хуйня.

код создает файловый объект:
open('file')
где в программе он хранится и почему не удаляется gc?
4kpt
Попробовал. Получается, что правда. Файловый дискриптор не создается. Потому как нет прямой ссылки на файл… Буду теперь пользоваться. Хотя, не, наверное не буду. Привычка, как говорится. Привык отслеживать состояние данных в файле и методы его открытия, закрытия. Кроме того, такой инструкцией не откроешь файл для чтения и записи одновременно….
dimy44
Ну, как всегда: “начали про Фому, закончили про Ерему”). Я все время так читаю из файла при необходимости, от ситуации зависит, выглядет читабельно, никаких побочных эффектов не наблюдал до сих пор. Да и у Россума в учебнике есть такие строки в примере(ах).
s0rg
Я проверил у себя - 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)
(я так понимаю что именно эта часть отвечает за файловые объекты) - ну нет там указание на принудительное закрытие (либо я его проморгал).
Да и в доке ничего про такое поведение не говорится.
4kpt
Я тоже искал, где происходит явное закрытие открытого дискриптора и не нашел… Странно. Но надо учесть.
s0rg
Причем, он закрывается даже после gc.disable()
cutwater
Пичаль… и эти люди дают советы по 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 если сие позволяет интерфейс. НИКОГДА не надеяться на сборщик мусора или подсчет ссылок.
odnochlen
dimy44
или так
sum_ = reduce(lambda x, y: int(x) + int(y), open(path_to_file))
Ака s0rg-а?

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

Файл закрывается, когда открытый файловый обьект съедается GC, но этот процесс недетерминирован, т.е. он может произойти в абсолютно любой момент, а может и не произойти вообще до закрытия программы, поэтому рассчитывать на это нельзя.
s0rg
cutwater
odnochlen
s0rg
Причем, он закрывается даже после gc.disable()
То есть:
import gc
gc.disable()
a = open('somefile').read()
Тоже самое.
Или циклические ссылки и gc у питона это два разных механизма?
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