Создание большого файла в Python с индикатором прогресса - PullRequest
0 голосов
/ 17 марта 2019

Мне нужно создать несколько больших файлов и показать прогресс записи в python. В настоящее время я использую этот код для создания файла. Но я не могу показать прогресс. Функция Python Write возвращает число, фактически записанное в конце операции write. Но мне нужно знать, сколько байтов записывается в каждую секунду.

oneGB = 1024*1024*1024 # 1GB
with open('large_file', 'wb') as fout:
    bytes_number = fout.write(os.urandom(oneGB))
    print(bytes_number)

Я знаю, что могу получить ожидаемый результат, используя dd команду с progress в Linux, к сожалению, система, с которой я работаю, не поддерживает progress в качестве флага состояния для команды dd. Я получаю это при попытке запустить команду dd.

dd: invalid status flag: `progress'

Вот моя команда дд:

dd if=/dev/zero of=temp_file status=progress count=1M bs=5120

1 Ответ

0 голосов
/ 17 марта 2019

Лучшим инструментом для этой работы, конечно же, является pv.Если у вас нет прав на глобальную установку, вы все равно сможете собрать и установить его из исходного кода (без sudo) только в своем пользовательском каталоге, поскольку он устанавливается с помощью autoconf / automake, поэтому вам просто нужноЗапустите ./configure с --prefix=$HOME/bin перед созданием и установкой.

Однако, если вы действительно хотите написать скрипт на Python, нужно рассмотреть две части: сам индикатор выполнения и данные для индикатора выполнения.

Для самого индикатора выполнения, @Mntfr уже упомянул вопрос , который охватывает это.

Для получения информации о индикаторе выполнения вам потребуется какой-либо способ отслеживания того, сколько данных было записано до сих пор.Таким образом, либо вам нужно писать меньшие суммы за раз (например, только 5 МБ, прежде чем обновлять индикатор выполнения), либо вам нужно будет асинхронно отслеживать размер выходного файла и соответственно обновлять индикатор выполнения.Первый метод может быть медленнее в целом (так как он включает в себя запуск и остановку записи), но второй метод, вероятно, сложнее (так как он требует асинхронности в вашем скрипте, что не очень интересно реализовать в Python, если вы просто не напишите два скрипта и не запуститеих бок о бок).Эти две идеи должны дать вам представление о том, как реализовать то, что вы ищете.

...