Начал изучать Python! Ну наконец то!
Рассматриваемая строка:
readMyFile=open("myFile.txt","r").read()
Строка выше считывает текстовый файл в переменную readMyFile. Что мне нужно знать:
Как я могу узнать состояние файла myFile.txt (если он открыт или закрыт)? А как его закрыть, если он открыт? Я знаю, как закрыть его, если у меня:
readMyFile=open("myFile.txt","r")
readMyFile.close
Но в приведенном выше случае переменная содержит текст из файла, а не файлового объекта.
Заранее спасибо!






Когда вы напишете это:
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, как долго вам нужно, чтобы значение сохранялось, простым отступом, и он гарантирует, что значение очищается в конце.
@ValeriyB Нет, они не эквивалентны. Позвольте мне отредактировать ответ, чтобы пояснить.
Так что лучше не делать этого. И мы не можем узнать, открыта ли она в этом случае, но она закрыта. Спасибо!
@ValeriyB Лучше всего использовать функцию-оболочку или оператор with, или и то, и другое. Когда ни один из них не работает, тогда лучше всего отслеживать файловый объект вручную, сохраняя его в переменной. Но обычно один из них работает.
пытаться:
with open("myFile.txt","r") as fd:
readMyFile = fd.read()
Здесь вам не нужно беспокоиться о закрытии файла. Иногда слишком много файлов открывается, но не закрывается, что может вызвать проблемы. Использование оператора with Python автоматически закроет ваш файл после блока with.
Прочтите про «с». Итак, в основном readMyFile = open ("myFile.txt", "r"). Read () равно решению 'with' в отношении того, что в обоих случаях файл будет закрыт и выброшен? - вот что я хотел знать