создать файл определенного размера в Python - PullRequest
28 голосов
/ 11 января 2012

Я хочу создать файл определенного размера (скажем, 1 ГБ).Контент не важен, так как я буду заполнять его.

Что я делаю:

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

Но это занимает слишком много времени, чтобы закончить.Это тратит на меня примерно 1 минуту.Что можно сделать, чтобы улучшить это?

Ответы [ 3 ]

38 голосов
/ 11 января 2012

ПРЕДУПРЕЖДЕНИЕ Это решение дает результат, который вы можете не ожидать.См. UPD ...

1 Создать новый файл.

2 искать в байте размера 1.

3 записать 1 байт.

4 прибыль:)

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

1073741824

UPD: Поиск и усечение создают разреженные файлы в моей системе (Linux + ReiserFS).Они имеют необходимый размер, но фактически не занимают места на устройстве хранения.Так что это не может быть правильным решением для быстрого распределения пространства.Я только что создал файл 100Gib, имеющий только 25Gib бесплатно и по-прежнему 25Gib бесплатно.

Незначительное обновление: Добавлен b префикс f.write("\0") для совместимости с Py3.

24 голосов
/ 11 января 2012

На вопрос был ответ ранее. Не уверен, является ли решение кросс-платформенным, но оно работает в Windows (файловая система NTFS) безупречно.

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

Этот ответ использует seek и write:

with open("file.to.create", "wb") as out:
    out.seek((1024 * 1024 * 1024) - 1)
    out.write('\0')
1 голос
/ 08 ноября 2018

Как пользователь Арафангиона упоминает в своем комментарии, ответы, предоставленные на данный момент, генерируют разреженных файлов .Чтобы сгенерировать не разреженный файл в python (который фактически занимает требуемое дисковое пространство), я использую следующий код из this другой ответ:

import os

file_name = 'test_file'
file_size = 1024 # size in bytes
with open(file_name, "wb") as f:
    f.write(os.urandom(file_size))

Чтобы проверить, является ли файлsparse в Linux - использовать команды ls -lhs и du -h <filename>, сравнить первый столбец ls -lhs с выводом du -h и, если он отличается, файл разрежен:

$ ls -lhs    
185548 -rw-r--r--    1 root     root      181.2M Nov  6 22:23 test

$du -h test
182M    test

В приведенном выше примере test это редкий файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...