首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -将json从字典对象写入BytesIO并存储为压缩的tar.gz

Python -将json从字典对象写入BytesIO并存储为压缩的tar.gz
EN

Stack Overflow用户
提问于 2019-12-09 02:41:27
回答 2查看 1.3K关注 0票数 0

我的代码大部分都在工作,但我在将tar文件写入远程文件系统时遇到了一些问题。下面的代码被认为是将一个大型字典序列化为json,并写入一个压缩文件对象。命名的临时文件是可选的,因为我也可以写入文件系统上的永久文件。fs是一个gcsfs.GCSFileSystem对象。它支持将文件复制到google云存储的put方法。

代码语言:javascript
运行
复制
def write_main(fs, remote_fp, data):
    """
    input -
        fs filesystem object
        fp filepath or path object
        data object
    output - bool
    ref: https://stackoverflow.com/questions/39109180/dumping-json-directly-into-a-tarfile
    """
    tmp_file = NamedTemporaryFile()
    filename = tmp_file.name
    with io.BytesIO() as out_stream, tarfile.open(filename, 'w|gz', out_stream) as tar_file:
        out_stream.write(json.dumps(data).encode())
        tar_file.size = out_stream.tell()
        out_stream.seek(0)
        tar_file.addfile(tar_file, out_stream)

    fs.put(filename, remote_fp)

当我尝试测试函数代码时,我得到以下错误:

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-23-020281a8b588> in <module>
      3     tar_file.size = out_stream.tell()
      4     out_stream.seek(0)
----> 5     tar_file.addfile(tar_file, out_stream)
      6
      7 fs.put(filename, remote_fp)

~/anaconda3/lib/python3.7/tarfile.py in addfile(self, tarinfo, fileobj)
   1964         tarinfo = copy.copy(tarinfo)
   1965
-> 1966         buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
   1967         self.fileobj.write(buf)
   1968         self.offset += len(buf)

AttributeError: 'TarFile' object has no attribute 'tobuf'
EN

回答 2

Stack Overflow用户

发布于 2019-12-09 03:00:23

我认为您为tar_file传递了错误的参数。它应该是一个TarInfo对象。这就是引发no属性'tobuf‘错误的原因。link

def addfile(self,tarinfo,fileobj=None):“Add TarInfo object tarinfo' to the archive. Iffileobj‘给定时,会从其中读取tarinfo.size字节并将其添加到存档中。您可以使用gettarinfo()创建TarInfo对象。在Windows平台上,应始终以'rb’模式打开‘fileobj’,以避免对文件大小的刺激。”

票数 0
EN

Stack Overflow用户

发布于 2019-12-09 13:46:16

@marian你是对的,但我犯了另外一个错误。将out_stream传递给tarfile.open后,由于某种原因导致写入失败。新代码如下所示:

代码语言:javascript
运行
复制
with io.BytesIO() as out_stream, tarfile.open(filename, 'w|gz') as tar_file:
    out_stream.write(json.dumps(data).encode())
    out_stream.seek(0)
    info = tarfile.TarInfo("data")
    info.size = len(out_stream.getbuffer())
    tar_file.addfile(info, out_stream)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59238700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档