2013-08-31 13 views
37

więc do tworzenia plików używam następujące:Jak wykonać wirtualne przetwarzanie plików?

fileHandle = open('fileName', 'w') 

następnie zapisać zawartość do pliku, zamknij plik. W następnym kroku przetwarzam plik. Na końcu programu otrzymuję "plik fizyczny", który muszę usunąć.

Czy istnieje sposób na napisanie "wirtualnego" pliku, który zachowuje się dokładnie tak jak "fizyczny" (pozwalając na manipulowanie nim w ten sam sposób), ale nie istnieje na końcu uruchamiania w Pythonie?

Odpowiedz

40

Być może warto rozważyć użycie tempfile.SpooledTemporaryFile, która zapewnia najlepsze z obu światów w tym sensie, że początkowo stworzy tymczasowy plik wirtualny oparty na pamięci, ale automatycznie przełączy się na fizyczny plik oparty na dysku, jeśli przechowywane są dane w pamięci przekracza określony rozmiar.

Kolejną miłą cechą jest to, że (przy użyciu pamięci) to automatycznie użyje OSOBĄ io.BytesIO lub io.StringIO w zależności od tego, co mode jest używany, co pozwala zarówno odczytu i zapisu ciągów Unicode lub danych binarnych (bajtów) do niego.

Jedyną trudną częścią może być fakt, że należy unikać zamykania pliku pomiędzy krokami, ponieważ spowodowałoby to usunięcie go z pamięci lub dysku. Zamiast tego możesz po prostu przewinąć go wstecz do początku za pomocą wywołania metody pliku seek(0).

Po całkowitym skończeniu pracy z plikiem i jego zamknięciu zostanie on automatycznie usunięty z dysku, jeśli ilość zawartych w nim danych spowodowała jego przeniesienie do fizycznego pliku.

+0

Odpowiednie przykłady: https://stackoverflow.com/questions/8577137/creating-a-tmp-file-in-python –

41

Masz StringIO i BytesIO w module io.

StringIO zachowuje się jak plik otwarty w trybie tekstowym - czytanie i pisanie ciągi Unicode (odpowiednik otwarcia pliku z io.open(filename, mode, encoding='...')) i BytesIO zachowuje się jak plik otwarty w trybie binarnym (mode='[rw]b') i może odczytać bajtów do zapisu.

Python 2:

In [4]: f = io.BytesIO('test') 
In [5]: type(f.read()) 
Out[5]: str 
In [6]: f = io.StringIO(u'test') 
In [7]: type(f.read()) 
Out[7]: unicode 

Python 3:

In [2]: f = io.BytesIO(b'test') 
In [3]: type(f.read()) 
Out[3]: builtins.bytes 
In [4]: f = io.StringIO('test') 
In [5]: type(f.read()) 
Out[5]: builtins.str 
+8

Należy zauważyć, że jeśli potrzebujesz interfejsu z kodem wymagającym nazw plików, to: [Jeśli cały dotychczasowy kod może zająć nazwę pliku, to instancja 'StringIO' nie jest drogą do zrobienia. Użyj modułu 'tempfile' do wygenerowania tymczasowej nazwy pliku.] (Http: // stackoverflow.com/questions/11892623/python-stringio-and-compatibility-with-with-statement-context-manager/11892712 # 11892712) – sdaau

8

Można użyć StringIO jako plik wirtualnego z oficjalnych documentation

import StringIO 

output = StringIO.StringIO() 
output.write('First line.\n') 
print >>output, 'Second line.' 

# Retrieve file contents -- this will be 
# 'First line.\nSecond line.\n' 
contents = output.getvalue() 

# Close object and discard memory buffer -- 
# .getvalue() will now raise an exception. 
output.close() 
+7

Pamiętaj, że jeśli chcesz przekazać go do innej funkcji, jako obiektu podobnego do pliku, powinieneś przewiń plik wirtualny za pomocą: output.seek (0) – RufusVS

+0

człowiek, czy kopiujesz wklejanie z oficjalnej dokumentacji? :) Myślę, że w takich przypadkach można użyć linku. – maxadamo

+0

@maxadamo Zrobione. Dzięki. –

0

Jest moduł StringIO, przeczytaj its documentation, powinno być łatwe w użyciu.

Pamiętaj jednak, że zachowałoby to zawartość "pliku" w pamięci. Jeśli masz za dużo danych, lepiej byłoby utworzyć prawdziwy plik, np. in/tmp, i usuń go później.

Powiązane problemy