2012-08-25 8 views
6

Ciao a tutti. Sto avendo un grande tempo a cercare di capire il motivo per cui non ci non ha bisogno di essere un attributo di chiusura per questo poche righe di codice che ho scritto:Python - L'oggetto 'str' non ha attributi '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() 

ho letto alcune cose e altri post della gente su questo, ma la loro gli script erano molto più complicati di quello che sto attualmente imparando, quindi non riuscivo a capire perché.

Sto facendo Learning Python nel modo più duro e apprezzerei qualsiasi aiuto.

Grazie in anticipo.

risposta

7

file_content è una variabile stringa, che contiene il contenuto del file - non ha alcuna relazione con il file. Il descrittore di file che apri con open(from_file) verrà chiuso automaticamente: le sessioni di file vengono chiuse dopo che gli oggetti file escono dall'ambito (in questo caso, immediatamente dopo .read()).

+0

Aha! Grazie mille. Non ho realizzato la distinzione tra stringhe e oggetti in questa forma. –

0

Quando si esegue file_content = open(from_file).read(), si imposta file_content sul contenuto del file (come letto da read). Non puoi chiudere questa stringa. È necessario salvare l'oggetto file separatamente dai suoi contenuti, qualcosa di simile a:

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

Hai un problema simile con new_file. È necessario separare la chiamata open(to_file) dallo write.

+0

Grazie per averlo chiarito. Il tuo esempio mi ha aiutato a capirlo. Non ho pensato alla differenza tra una stringa e l'oggetto file. –

+0

La differenza non è il caso qui. 'theFile' è un file, mentre' theFile.read() 'è una stringa che non ha una funzione di chiusura. – Nasir

+0

@Nasir Sto cercando di capire se ho capito bene: quindi il motivo per cui non ho bisogno di una funzione di chiusura è perché 'file_content' è una stringa (perché ho chiamato 'leggi' su di esso)? –

1

open(...) restituisce un riferimento a un oggetto file, chiamando read su che legge il file restituendo un oggetto stringa, chiamando write scrive ad esso tornare None, nessuno dei quali hanno un attributo 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. 

C'è un paio di modi di porre rimedio a questa:

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

o con Python> = 2,5

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

Il with farà in modo che il file è chiuso.

+0

È meglio non sovrascrivere la variabile 'file'. Quindi è meglio dire 'con open (from_file) come f: ...' invece di 'con open (from_file) come file: ...'. – behnam

+0

@behnam yeah questo è un buon punto, grazie. –

+0

Grazie. Ho bisogno di prendere l'abitudine di leggere i documenti Python. Perché sono sopraffatto e perso, cerco di evitarlo, ma ho bisogno di iniziare ad abituarmi. –

Problemi correlati