2012-01-11 14 views
23

Chcę utworzyć plik o określonej wielkości (np. 1GiB). Treść nie jest ważna, ponieważ wypełnię w niej elementy.utwórz plik o konkretnej wielkości w pytonie

Co robie to:

f = open("E:\\sample", "wb") 
size = 1073741824 # bytes in 1 GiB 
f.write("\0" * size) 

Ale to trwa zbyt długo, aby zakończyć. Wydaje mi mniej więcej 1 minutę. Co można zrobić, aby to poprawić?

+0

1 min brzmi tak dobre, jak to się robi na mnie. BTW, co dokładnie robisz z tym plikiem? –

+4

1073741824 bajtów! = 1 GB. Używać dysku SSD zamiast mechanicznego dysku twardego? Zapisujesz na dysku lokalnym zamiast w udziale sieciowym? – Johnsyweb

+3

@Johnsyweb dlaczego? czy to nie jest "1024 * 1024 * 1024"? – onemach

Odpowiedz

32

OSTRZEŻENIE To rozwiązanie daje wynik, którego można się nie spodziewać. Zobacz UPD ...

1 Utwórz nowy plik.

2 poszukiwanie rozmiaru-1 bajtu.

3 Napisz 1 bajt.

4 zysk :)

f = open('newfile',"wb") 
f.seek(1073741824-1) 
f.write("\0") 
f.close() 
import os 
os.stat("newfile").st_size 

1073741824 

UPD: Seek and obciąć zarówno tworzenie plików rzadkich w moim systemie (Linux + ReiserFS). Mają rozmiar w razie potrzeby, ale w rzeczywistości nie zajmują miejsca na urządzeniu pamięci masowej. To nie może być właściwe rozwiązanie dla szybkiego przydzielania miejsca. Właśnie stworzyłem plik 100Gib, który ma tylko 25Gib i nadal ma 25Gib w wyniku.

+0

fajne, działa dobrze – onemach

+0

Jeśli twój system go obsługuje, to rozwiązanie 'truncate()' może - ściśle przestrzegane - być lepsze, ponieważ to rozwiązanie tutaj zużywa 1 blok alokacji dla tego pliku, chociaż nie byłoby to konieczne. – glglgl

+2

Czy jednak nie generuje to rozrzedzonego pliku? (Może to być potrzebne, ale to nie to samo) – Arafangion

19

Pytanie to było wcześniej przed answered. Nie masz pewności, czy jest to rozwiązanie wieloplatformowe, ale działa bezbłędnie w systemie Windows (systemie plików NTFS).

with open("file.to.create", "wb") as out: 
    out.truncate(1024 * 1024 * 1024) 

This answer wykorzystuje seek i write:

with open("file.to.create", "wb") as out: 
    out.seek((1024 * 1024 * 1024) - 1) 
    out.write('\0') 
+7

[Dokumenty:] (http://docs.python.org/library/stdtypes.html # file-objects) _Uwaga, ż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ć niezmieniony, zwiększyć do określonego rozmiaru, jak gdyby był wypełniony zero, lub zwiększyć do podanego size with undefined new content._ –

+0

@JanneKarila W tym przypadku plik 'file.to.create' jest pustym plikiem, więc określony rozmiar będzie zawsze przekraczał bieżący rozmiar pliku? – qed

+0

@qed Tak, będzie. –