Python: el objeto ‘str’ no tiene ningún atributo ‘close’

Hola a todos. Me estoy divirtiendo mucho tratando de entender por qué no es necesario que haya un atributo de cierre para estas pocas líneas de código que escribí:

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() 

Leí algunas cosas y publicaciones de otras personas sobre esto, pero sus guiones eran mucho más complicados de lo que estoy aprendiendo actualmente, así que no pude averiguar por qué.

Estoy aprendiendo Python the Hard Way y agradecería cualquier ayuda.

Gracias de antemano.

file_content es una variable de cadena, que contiene el contenido del archivo, no tiene ninguna relación con el archivo. El descriptor de archivo que abra con open(from_file) se cerrará automáticamente: las sesiones de archivo se cerrarán después de que los objetos de archivo salgan del ámbito (en este caso, inmediatamente después de .read() ).

open(...) devuelve una referencia a un objeto de archivo, llamando a la read que lee el archivo que devuelve un objeto de cadena, invitando a write , devolviendo None , ninguno de los cuales tiene un atributo de 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. 

Hay un par de maneras de remediar esto:

 >>> file = open(from_file) >>> content = file.read() >>> file.close() 

o con python> = 2.5

 >>> with open(from_file) as f: ... content = f.read() 

El with se asegurará de que el archivo está cerrado.

Cuando haces file_content = open(from_file).read() , configuras file_content a los contenidos del archivo (tal como se lee por read ). No puedes cerrar esta cadena. Debe guardar el objeto de archivo por separado de su contenido, algo como:

 theFile = open(from_file) file_content = theFile.read() # do whatever you need to do theFile.close() 

Tienes un problema similar con new_file . Debe separar la llamada open(to_file) de la write .