2012-08-25 14 views
6

Hola a todos. Estoy teniendo un gran tiempo tratando de averiguar por qué no tiene que ser un atributo de cierre de algunas líneas de código que he escrito:Python - el objeto 'str' no tiene el atributo 'cerrar'

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 otros mensajes de la gente acerca de esto, pero su los guiones eran mucho más complicados de lo que estoy aprendiendo actualmente, así que no pude entender por qué.

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

Gracias de antemano.

Respuesta

7

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 cierran después de que los objetos de archivo salgan del alcance (en este caso, inmediatamente después de .read()).

+0

Aha! Muchas gracias. No me di cuenta de la distinción entre cadenas y objetos en esta forma. –

0

Cuando hace file_content = open(from_file).read(), establece file_content en el contenido del archivo (tal como se lee en read). No puedes cerrar esta cadena. Es necesario guardar el objeto de archivo por separado de su contenido, algo así como:

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

usted tiene un problema similar con new_file. Debe separar la llamada open(to_file) del write.

+0

Gracias por aclarar esto. Tu ejemplo me ayudó a entenderlo. No pensé en la diferencia entre una cadena y el objeto de archivo. –

+0

La diferencia no es el caso aquí. 'theFile' es un archivo, mientras que' theFile.read() 'es una cadena que no tiene una función de cierre. – Nasir

+0

@Nasir Estoy tratando de ver si entiendo esto correctamente: entonces la razón por la que no necesitaba una función de cierre es porque 'file_content' es una cadena (porque llamé 'leer' en ella)? –

1

open(...) devuelve una referencia a un objeto de archivo, llamando read en que lee el archivo de devolver un objeto de cadena, llamando a write escribe lo va a devolver None, ninguno de los cuales tiene un atributo 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 poner remedio a esta:

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

o con el pitón> = 2,5

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

El with se asegurará de que se cierra el archivo.

+0

Es mejor que no sobrescriba la variable 'archivo'. Por lo tanto, es mejor decir 'con open (from_file) como f: ...' en lugar de 'con open (from_file) as file: ...'. – behnam

+0

@behnam, sí, ese es un buen punto, gracias. –

+0

Gracias. Necesito adquirir el hábito de leer documentos de Python. Porque me siento abrumado y perdido, trato de evitarlo, pero necesito empezar a acostumbrarme. –

Cuestiones relacionadas