2012-01-11 29 views
23

Quiero crear un archivo de un tamaño particular (digamos, 1GiB). El contenido no es importante ya que llenaré de contenido.crear archivo de tamaño particular en python

Lo que estoy haciendo es:

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

Pero esto toma demasiado tiempo para terminar. Me pasa aproximadamente 1 minuto. ¿Qué se puede hacer para mejorar esto?

+0

1 min suena casi tan bueno como se pone a mí. Por cierto, ¿qué estás haciendo exactamente con este archivo? –

+4

1073741824 bytes! = 1GB. ¿Usa una SSD en lugar de una HDD mecánica? Escribir en el disco local en lugar de compartir la red? – Johnsyweb

+3

@Johnsyweb ¿por qué? ¿No es ese '1024 * 1024 * 1024'? – onemach

Respuesta

32

ADVERTENCIA Esta solución da el resultado que usted podría no esperar. Consulte UPD ...

1 Cree un nuevo archivo.

2 buscan el tamaño-1 byte.

3 escribe 1 byte.

4 beneficios :)

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

1073741824 

UPD: Buscad y truncar tanto para crear archivos dispersos en mi sistema (Linux + ReiserFS). Tienen el tamaño necesario pero no consumen espacio en el dispositivo de almacenamiento de hecho. Por lo tanto, esta no puede ser la solución adecuada para la asignación de espacio rápido. Acabo de crear el archivo 100Gib con solo 25Gib libre y todavía tengo 25Gib gratis en el resultado.

+0

cool, funciona bien – onemach

+0

Si su sistema lo admite, la solución 'truncate()' podría ser, estrictamente, mejor, ya que esta solución aquí consume 1 bloque de asignación para este archivo aunque no sería necesario. – glglgl

+2

¿No genera eso un archivo disperso? (Esto puede ser lo que se necesitaba, pero no es lo mismo) – Arafangion

19

La pregunta ha sido answered antes. No estoy seguro de si la solución es multiplataforma, pero funciona en Windows (sistema de archivos NTFS) sin problemas.

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

This answer utiliza seek y write:

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

[Docs:] (http://docs.python.org/library/stdtypes.html # file-objects) _Tenga en cuenta que si un tamaño específico excede el tamaño actual del archivo, el resultado depende de la plataforma: las posibilidades incluyen que el archivo permanezca inalterado, aumente hasta el tamaño especificado como si estuviera lleno de cero o aumente hasta el especificado tamaño con contenido nuevo indefinido. –

+0

@JanneKarila En este caso, 'archivo.a.crear' es un archivo vacío, por lo que el tamaño especificado siempre excederá el tamaño actual del archivo? – qed

+0

@qed Sí lo hará. –

Cuestiones relacionadas