Python 3. Состояние файла открыто или закрыто

Начал изучать Python! Ну наконец то!

Рассматриваемая строка:

readMyFile=open("myFile.txt","r").read()

Строка выше считывает текстовый файл в переменную readMyFile. Что мне нужно знать:

Как я могу узнать состояние файла myFile.txt (если он открыт или закрыт)? А как его закрыть, если он открыт? Я знаю, как закрыть его, если у меня:

readMyFile=open("myFile.txt","r")
readMyFile.close

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

Заранее спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
967
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы напишете это:

readMyFile=open("myFile.txt","r").read()

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

Решение состоит в том, чтобы просто не делать этого: любое значение, которое вы хотите использовать, сохраните его в переменной (или члене списка или dict, или атрибуте экземпляра, или что-то еще - просто сохраните его где-то), а затем (как вы уже знаете из вашего вопроса) вы можете использовать его:

>>> myfile = open("myFile.txt","r")
>>> readMyFile = myFile.read()
>>> myFile.closed
False
>>> myFile.close()
>>> myFile.closed
True

Хотя в этом случае есть еще лучший ответ:

>>> with open("myFile.txt", "r") as myFile:
...     readMyFile = myFile.read()

Теперь myFile автоматически закрывается в конце оператора with, так что вам никогда не придется об этом беспокоиться.

Или, что еще лучше, вы можете обернуть это функцией:

>>> def readfile(name):
...     with open(name) as myFile:
...         return myFile.read()
>>> readMyFile = readfile("myFile.txt")

… И ни один из ваших кодов даже не должен думать о файловых объектах, за исключением двух строк кода внутри readfile.


В комментарии вы спросили:

readMyFile=open("myFile.txt","r").read() is equal to 'with' solution in regard, that in both cases file will be closed and throwed away?

Нет, они не эквивалентны.

  • Первая версия отбрасывает вашу ссылку на файловый объект, поэтому файл теперь является мусором, но вы оставляете его на усмотрение Python, чтобы выяснить, что это мусор, и очистить его (что закрывает файл) для вас всякий раз, когда он замечает и доходит до этого.

  • Версия with сообщает Python, что нужно выполнить очистку, как только завершится выполнение оператора with.

Как это происходит, в этом конкретном примере с CPython (реализация Python, которую вы, вероятно, используете, если не знаете, какую из них используете), Python определит, что значение является мусором, и закроет файл на конец заявления, поэтому нет никакой разницы.

Но это не так в немного иных случаях. И вы не можете узнать, в каких случаях это правда, не зная немного о том, как работает CPython. И даже тогда, если вы запустите тот же код, скажем, в PyPy вместо CPython, он будет делать что-то другое. И именно поэтому многие программы Python загадочным образом иногда не могут записать последние 300 байт текстового файла, или веб-серверы Python иногда дают сбой из-за нехватки файловых дескрипторов и т. д. - это именно та проблема, которую решает оператор with: вы сообщаете Python, как долго вам нужно, чтобы значение сохранялось, простым отступом, и он гарантирует, что значение очищается в конце.

Прочтите про «с». Итак, в основном readMyFile = open ("myFile.txt", "r"). Read () равно решению 'with' в отношении того, что в обоих случаях файл будет закрыт и выброшен? - вот что я хотел знать

ValeriyB 05.07.2018 09:29

@ValeriyB Нет, они не эквивалентны. Позвольте мне отредактировать ответ, чтобы пояснить.

abarnert 05.07.2018 09:32

Так что лучше не делать этого. И мы не можем узнать, открыта ли она в этом случае, но она закрыта. Спасибо!

ValeriyB 05.07.2018 09:37

@ValeriyB Лучше всего использовать функцию-оболочку или оператор with, или и то, и другое. Когда ни один из них не работает, тогда лучше всего отслеживать файловый объект вручную, сохраняя его в переменной. Но обычно один из них работает.

abarnert 05.07.2018 09:44

пытаться:

with open("myFile.txt","r") as fd:
     readMyFile = fd.read()

Здесь вам не нужно беспокоиться о закрытии файла. Иногда слишком много файлов открывается, но не закрывается, что может вызвать проблемы. Использование оператора with Python автоматически закроет ваш файл после блока with.

Другие вопросы по теме