Команда shutil copy записывает 0-байтовые файлы, копируя временные файлы

Если criteria - тип класса, я сомневаюсь, что он будет оптимизирован, потому что другой поток всегда может изменить это значение в то же время. Для struct s я не уверен, но мое чувство кишки состоит в том, что он не будет оптимизирован, но я думаю, что это не повлияет на производительность в этом случае.

1
задан Andrew Gill 19 March 2019 в 08:38
поделиться

1 ответ

Это потому, что content еще не был записан на диск, когда вы выполняете копирование. Это происходит потому, что записи буферизуются и не всегда происходят сразу после вашего звонка file.write. Чтобы убедиться, что содержимое записано на диск в данный момент, вы можете использовать file.flush.

В вашем случае достаточно изменить код на:

def write_file(file_destination: str, content: bytes):
    with tempfile.NamedTemporaryFile() as fp:
        fp.write(content)
        fp.flush()
        shutil.copy(fp.name, file_destination)

. Для получения дополнительной информации о том, когда содержимое фактически записывается на диск, вы можете увидеть документацию io.BufferedWriter [ 116]. Соответствующая часть:

Буфер будет записан в базовый объект RawIOBase при различных условиях, включая:

  • , когда буфер становится слишком маленьким для всех ожидающих данных ;
  • при вызове flush ();
  • при запросе seek () (для объектов BufferedRandom);
  • при закрытии или уничтожении объекта BufferedWriter.
  • ]

Следовательно, в вашем первом примере возможно, что он работает только иногда, потому что в те моменты контент, который вы пишете, превышает буфер и поэтому должен быть немедленно записан.

Ваш второй пример, напротив, работает, потому что, когда вы выходите из блока with, файл закрывается, и, следовательно, буфер должен быть очищен и записан на диск.

0
ответ дан tyrion 19 March 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: