2012-08-25 57 views
6

‍Hi herkese ait bir özelliği yoktur. Ben yazdım bu kod birkaç satır için bir kapanış niteliği olacaksa gerekmez neden anlamaya çalışırken büyük bir zaman yaşıyorum: Python - 'str' nesnesinin '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() 

Bu konuda bazı şeyler ve diğer insanların mesajlarını okumak, ama onların Komut dosyaları şu anda öğrendiğimden çok daha karmaşıktı, bu yüzden nedenini anlayamadım.

Python'u Zorlu Yolculuk yapıyorum ve herhangi bir yardımı takdir ediyorum.

Önceden teşekkür ederiz.

cevap

7

file_content, dosyanın içeriğini içeren bir dize değişkendir - dosyayla ilişkisi yoktur. open(from_file) ile açtığınız dosya tanıtıcısı otomatik olarak kapatılacak: dosya nesneleri, nesneler kapsam dışına çıktıktan sonra kapatılır (bu durumda, .read()'dan hemen sonra).

+0

Aha! Çok teşekkür ederim. Bu formdaki dizeler ve nesneler arasındaki ayrımı fark etmedim. –

0

file_content = open(from_file).read()'u yaptığınızda, dosyanın içeriğine file_content'u ayarlarsınız (read tarafından okunan). Bu dizeyi kapatamazsın. Sen new_file ile benzer bir sorun var

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

: Sen, içeriğinden ayrı dosya nesnesini kaydetmek gibi bir şey gerekiyor. open(to_file) aramasını write'dan ayırmalısınız.

+0

Bunu temizlediğiniz için teşekkür ederiz. Örneğiniz bunu anlamama yardımcı oldu. Bir dize ile dosya nesnesi arasındaki farkı düşünmedim. –

+0

Buradaki fark burada değil. 'File.read() ', yakın bir işlevi olmayan bir dizedir. – Nasir

+0

@Nasir Bunu doğru anladığımı anlamaya çalışıyorum: bu yüzden yakın bir işleve gerek duymama sebebim, 'file_content' bir dizedir (çünkü üzerinde 'okuduğum'). –

1

open(...) bir close niteliği var ikisi de None, geri dönen write yazar çağırarak, bu bir dize nesne dönen dosyasını okur üzerinde read çağıran bir dosya nesnesine bir başvuru verir.

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

veya python ile

> = 2,5

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

with dosya kapalı olduğundan emin yapacaktır:

>>> 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. 

buna çare bir çift yollarını dönmen için.

+0

"dosya" değişkeninin üzerine yazmamalısınız. Yani, açık (from_file) ile f: ... 'yerine dosya ile açık (from_file):' 'yerine söylemek daha iyidir. – behnam

+0

@behnam evet bu iyi bir nokta, teşekkürler. –

+0

Teşekkürler. Python belgelerini okuma alışkanlığına girmem gerekiyor. Çünkü bunaldığım ve kaybettiğim için, bundan kaçınmaya çalışıyorum ama buna alışmaya başladım. –

İlgili konular