shutil copy命令写入0字节文件复制临时文件

问题描述 投票:1回答:1

我有另一种方法调用此函数3次写入3个不同的文件。前2个文件按预期复制到目标文件夹,第三个文件始终为零字节。如果我关闭删除,我可以看到所有3个临时文件都已成功写入。代码报告没有错误,但在进程结束时,第三个文件始终为空。

有谁知道为什么这次失败3次失败?

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

但是,我想了解为什么前两个文件有效,第三个文件不在上面的代码中。

def write_file(file_destination: str, content: bytes):
    with tempfile.NamedTemporaryFile(delete=False) as fp:
        fp.write(content)
    shutil.copy(fp.name, file_destination)
    os.remove(fp.name)
python shutil temp
1个回答
2
投票

这是因为当您执行复制时,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的文档。相关部分是:

缓冲区将在各种条件下写出到底层的RawIOBase对象,包括:

  • 当缓冲区对于所有未决数据而言太小时;
  • 当flush()被调用时;
  • 当请求seek()时(对于BufferedRandom对象);
  • 当BufferedWriter对象被关闭或销毁时。

因此,在您的第一个示例中,它有时可能有效,因为您正在编写的内容超过缓冲区,因此需要立即写出。

相反,你的第二个例子可以工作,因为当你退出with块时,文件被关闭,因此需要刷新缓冲区并将其写入磁盘。

© www.soinside.com 2019 - 2024. All rights reserved.