Python - объект 'str' не имеет атрибута 'close'
Я прекрасно провожу время, пытаясь понять, почему не нужно закрывающего атрибута для этих нескольких строк кода, которые я написал:
from sys import argv
from os.path import exists
script, from_file, to_file = argv
file_content = open(from_file).read()
new_file = open(to_file, 'w').write(file_content)
new_file.close()
file_content.close()
Я читал об этом кое-что и посты других людей, но их сценарии были намного сложнее, чем то, что я сейчас изучаю, поэтому я не мог понять, почему.
Я делаю Изучение Python трудный путь и был бы признателен за любую помощь.
Ответы
Ответ 1
file_content
- строковая переменная, содержащая содержимое файла - она не имеет никакого отношения к файлу. Дескриптор файла, который вы открываете с помощью open(from_file)
, автоматически закрывается: сеансы файлов закрываются после того, как файловые объекты выходят из области действия (в этом случае сразу после .read()
).
Ответ 2
open(...)
возвращает ссылку на файл-объект, вызывающий read
, на котором читается файл, возвращающий строковый объект, вызывающий write
запись в него, возвращающий None
, ни один из которых не имеет атрибута close
.
>>> help(open)
Help on built-in function open in module __builtin__:
open(...)
open(name[, mode[, buffering]]) -> file object
Open a file using the file() type, returns a file object. This is the
preferred way to open a file.
>>> a = open('a', 'w')
>>> help(a.read)
read(...)
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was requested
may be returned, even if no size parameter was given.
>>> help(a.write)
Help on built-in function write:
write(...)
write(str) -> None. Write string str to file.
Note that due to buffering, flush() or close() may be needed before
the file on disk reflects the data written.
Вот несколько способов исправить это:
>>> file = open(from_file)
>>> content = file.read()
>>> file.close()
или с python >= 2.5
>>> with open(from_file) as f:
... content = f.read()
with
будет убедиться, что файл закрыт.
Ответ 3
Когда вы выполняете file_content = open(from_file).read()
, вы устанавливаете file_content
в содержимое файла (как прочитано read
). Вы не можете закрыть эту строку. Вам нужно сохранить файл отдельно от его содержимого, например:
theFile = open(from_file)
file_content = theFile.read()
# do whatever you need to do
theFile.close()
У вас есть аналогичная проблема с new_file
. Вы должны отделить вызов open(to_file)
от write
.