2013-06-15 16 views
27

Mam plik tymczasowy z pewną zawartością i skryptem Pythona generującym pewne dane wyjściowe do tego pliku. Chcę to powtórzyć N razy, więc muszę ponownie użyć tego pliku (w rzeczywistości tablicy plików). Usuwam całą treść, więc plik tymczasowy będzie pusty w następnym cyklu. Do kasowania zawartości używam tego kodu:Jak usunąć tylko zawartość pliku w pythonie

def deleteContent(pfile): 

    pfile.seek(0) 
    pfile.truncate() 
    pfile.seek(0) # I believe this seek is redundant 

    return pfile 

tempFile=deleteContent(tempFile) 

Moje pytanie brzmi: czy istnieją jakieś inne (lepsze, bezpieczniejsze lub krótszy) sposób, aby usunąć całą zawartość bez faktycznie usuwanie pliku tymczasowego z dysku?

Coś takiego jak tempFile.truncateAll()?

+1

Drugie wyszukiwanie jest rzeczywiście zbędne. Dlaczego nie po prostu utworzyć ** tymczasowy plik **? –

+0

Ponieważ dla jednego wspólnego uruchomienia skryptu będę potrzebował około ~ 400 plików tymczasowych zamiast ~ 10. Więc myślę, że lepiej je poddać recyklingowi. Czy się mylę? – bartimar

+0

Czy napotkasz jakiekolwiek problemy? Właśnie utworzyłem nowe pliki tymczasowe i pozwoliłem Pythonowi i systemowi operacyjnemu oczyścić te, które zamknąłem. –

Odpowiedz

58

Jak usunąć tylko zawartość pliku w python

Istnieje kilka sposobów zestawu logicznego rozmiaru pliku do 0 ° C, w zależności od sposobu dostępu do tego pliku:

Aby opróżnić open file:

def deleteContent(pfile): 
    pfile.seek(0) 
    pfile.truncate() 

Aby opróżnić otwarty plik, którego plik deskryptora Wiadomo:

def deleteContent(fd): 
    os.ftruncate(fd, 0) 
    os.lseek(fd, 0, os.SEEK_SET) 

Aby opróżnić plik zamknięty (którego nazwa jest znana)

def deleteContent(fName): 
    with open(fName, "w"): 
     pass 



Mam tymczasowy plik z niektórych treści [ ...] Potrzebuję do ponownego użycia t kapelusz plik

Mając na uwadze powyższe, w ogólnym przypadku to prawdopodobnie nie jest skuteczne, ani pożądane ponownego plik tymczasowy. Chyba, że ​​masz bardzo specyficzne potrzeby, warto pomyśleć o użyciu tempfile.TemporaryFile i menedżera kontekstowe prawie przejrzysty utworzyć/użytkowania/usuń pliki tymczasowe:

import tempfile 

with tempfile.TemporaryFile() as temp: 
    # do whatever you want with `temp` 

# <- `tempfile` guarantees the file being both closed *and* deleted 
#  on exit of the context manager 
+0

'pfile.truncate (0)' nie zresetuje wskaźnika pliku, więc będziesz musiał wykonać 'pfile.seek (0)' w dowolny sposób. To samo dotyczy 'os.ftruncate()'. FWIW, możesz pobrać deskryptor pliku z 'pfile.fileno()', więc 'os.ftruncate (pfile.fileno(), 0)' zadziała, ale nadal będziesz musiał wykonać 'pfile.seek (0) 'później. – Aya

+2

From http://docs.python.org/2/library/stdtypes.html#file.truncate 'Zwróć uwagę, że jeśli określony rozmiar przekracza bieżący rozmiar pliku, wynik zależy od platformy: możliwości obejmują to, że plik może pozostać niezmienione, zwiększ do określonego rozmiaru, tak jakby był wypełniony zero, lub zwiększ do określonego rozmiaru o niezdefiniowaną nową treść. "Dlatego tego nie zrobiłem. – bartimar

+0

Rzeczywiście naprawdę patrzyłem na ten dokument. Rozumiem, że wskaźnik pliku mógłby pozostać na swoim miejscu, jeśli nadal jest prawidłowy (tzn. Wskazuje przed nowym logicznym końcem pliku). Ale czym jest obcinanie pliku przed bieżącą pozycją? Więc zrobiłem test. W systemie Linux 'truncate (0)' nie przesuwa aktualnej pozycji zgodnie z raportem 'ftell()' - ale kolejne zapisy są dokonywane na początku pliku zgodnie z oczekiwaniami. –

2

Co może być prostsze niż coś takiego:

import tempfile 

for i in range(400): 
    with tempfile.TemporaryFile() as tf: 
     for j in range(1000): 
      tf.write('Line {} of file {}'.format(j,i)) 

To tworzy 400 plików tymczasowych i zapisuje 1000 linii do każdego pliku tymczasowego. Wykonuje się w mniej niż 1/2 sekundy na mojej nie wyróżniającej się maszynie. Każdy plik tymczasowy sumy jest tworzony i usuwany, ponieważ menedżer kontekstu otwiera się i zamyka w tym przypadku. Jest szybki, bezpieczny i na różnych platformach.

Korzystanie z tempfile jest o wiele lepsza niż próba ponownego wymyślenia.

+1

Myślę, że 'seek (0)' i 'truncate()' bez dla cyklu jest rzeczywiście łatwiejsze, lepsze, (może szybciej) i ładniejsze dla OS/Pythona :) Obawiałem się, że ktoś zostanie przyłapany na ponownym użyciu/recyklingu ... Wciąż moje pytanie jest takie samo, więc to nie jest odpowiedź. – bartimar

+2

Czy przetestowałeś to założenie? Czy masz czas, aby to zobaczyć? – dawg

2

Można to zrobić:

def deleteContent(pfile): 
    fn=pfile.name 
    pfile.close() 
    return open(fn,'w') 
2

Myślę, że najłatwiej jest po prostu otworzyć plik w trybie zapisu, a następnie zamknij ją. Na przykład, jeśli plik myfile.dat zawiera:

"This is the original content" 

Następnie można po prostu napisać:

f = open('myfile.dat', 'w') 
f.close() 

byłoby to wymazanie całej zawartości. Następnie możesz zapisać nową zawartość do pliku:

f = open('myfile.dat', 'w') 
f.write('This is the new content!') 
f.close() 
Powiązane problemy