2015-05-21 10 views
11

Po otwarciu pliku jest on przechowywany w otwartym obiekcie pliku, który daje dostęp do różnych metod na nim, takich jak czytanie lub pisanie.Co mogę zrobić z obiektem o zamkniętym pliku?

>>> f = open("file0") 
>>> f 
<open file 'file0', mode 'r' at 0x0000000002E51660> 

Oczywiście po zakończeniu należy zamknąć plik, aby nie zajmować miejsca w pamięci.

>>> f.close() 
>>> f 
<closed file 'file0', mode 'r' at 0x0000000002E51660> 

Pozostawia zamknięty plik, aby obiekt nadal istniał, ale nie jest już używany, aby zachować jego czytelność. Ale czy jest jakieś praktyczne zastosowanie tego? Nie można go przeczytać ani napisać. Nie można go ponownie użyć do ponownego otwarcia pliku.

>>> f.open() 

Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    f.open() 
AttributeError: 'file' object has no attribute 'open' 

>>> open(f) 

Traceback (most recent call last): 
    File "<pyshell#10>", line 1, in <module> 
    open(f) 
TypeError: coercing to Unicode: need string or buffer, file found 

Czy istnieje praktyczny użytek dla tego zamkniętego obiektu pliku poza identyfikacją, że obiekt pliku jest odwoływany, ale jest zamknięty?

+3

Ponadto, jaka jest alternatywa? Obiekt nie może sam się usunąć ani zmodyfikować odniesień do niego, więc zamknięty plik jest zasadniczo jedyną opcją. –

+0

@Lattyware Nie zdawałem sobie sprawy, że obiekt nie może sam się usunąć, ale ma sens jako praktyka. – SuperBiasedMan

+2

Możesz sprawdzić, czy plik został "naprawdę" zamknięty przez f.closed –

Odpowiedz

16

Jednym z zastosowań jest przy użyciu nazwy, aby ponownie otworzyć plik:

open(f.name).read() 

używam atrybut name przy zmianie zawartości pliku za pomocą NamedTemporaryFile napisać zaktualizowany treści następnie zastąpić oryginalny plik z shutil.move :

with open("foo.txt") as f, NamedTemporaryFile("w",dir=".", delete=False) as temp: 
    for line in f: 
     if stuff 
     temp.write("stuff") 

shutil.move(temp.name,"foo.txt") 

również jako skomentował można użyć f.closed aby sprawdzić, czy plik jest naprawdę zamknięte.