download_fileobj()可以追加而不是覆盖目标文件吗?

时间:2017-10-02 23:30:47

标签: amazon-s3 boto3

在以下代码中,让objectobject2成为boto3的“s3.Object”类型的实例:

data = open('out.dat', 'wb')

object.download_fileobj(data)
object2.download_fileobj(data)

结果是'out.dat'将包含object2的内容 - 而不是我期望的object和object2的串联。有没有办法让download_fileobj()附加到下载目的地而不是覆盖它?

我期望连锁结果的原因与此相似:

with open('test.file', 'wb') as data:
  data.write('hello')
  data.write(' world')

文件内容是“write()”调用的连接。

为了让事情更加混乱,以下内容产生了S3对象的连接:

with open('out.dat', 'ab') as data:
  object.download_fileobj(data)
  object2.download_fileobj(data)

将文件模式从“wb”更改为“ab”会导致连接行为而不是覆盖行为。但我会认为'ab'与'wb'在文件打开操作后没有任何区别 - 只发生一次 - 因此对结果没有影响(假设最初不存在'out.dat'。)< / p>

1 个答案:

答案 0 :(得分:2)

这不是ab模式的用途吗?

data = open('out.dat', 'wb')

object.download_fileobj(data)
data.close();

data = open('out.dat','ab'); 
object2.download_fileobj(data)
data.close();

现在data都是对象。

希望它有所帮助。

<强> EDIT1:

只有运行一次才会更好,

with open('out.dat', 'ab') as data:
  object.download_fileobj(data)
  object2.download_fileobj(data)

ab - 以追加二进制模式打开。一个危险的事情是代码不可重新运行。

如果再次运行它,它将如下所示,object + object2 + object + object2。 Fil以附加模式打开,无论写入什么都会到文件的末尾。