44
votes

I want to create a file of particular size (say, 1GiB). The content is not important since I will fill stuff into it.

What I am doing is:

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

But this takes too long to finish. It spends me roughly 1 minute. What can be done to improve this?

2
1 min sounds about as good as it gets to me. BTW, what exactly are you doing with this file? - David Robinson
1073741824 bytes != 1GB. Use an SSD instead of a mechanical HDD? Write to local disk rather than a network share? - Johnsyweb
@onemach 1 GB = 10^9 B. 1 GiB = 2^30 B. - glglgl
@glglgl: Given how few people use gibibyte as a term, possibly due to how ridiculous it sounds (including many file system displays that summarize using base-2 GB instead of base-10 GB), getting pedantic about GiB is just that: Being pedantic. Hard drive manufacturers use base-10 to advertise larger sizes; almost no one else does. - ShadowRanger

2 Answers

49
votes

WARNING This solution gives the result that you might not expect. See UPD ...

1 Create new file.

2 seek to size-1 byte.

3 write 1 byte.

4 profit :)

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

1073741824

UPD: Seek and truncate both create sparse files on my system (Linux + ReiserFS). They have size as needed but don't consume space on storage device in fact. So this can not be proper solution for fast space allocation. I have just created 100Gib file having only 25Gib free and still have 25Gib free in result.

Minor Update: Added b prefix to f.write("\0") for Py3 compatibility.

38
votes

The question has been answered before. Not sure whether the solution is cross platform, but it works in Windows (NTFS file system) flawlessly.

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

This answer uses seek and write:

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