首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JSON直接转储到tarfile

将JSON直接转储到tarfile
EN

Stack Overflow用户
提问于 2016-08-23 19:22:37
回答 1查看 2.4K关注 0票数 0

我有一大串dict对象。我希望将这个列表存储在tar文件中,以便远程交换。通过将json.dumps()字符串写入以'w:gz‘模式打开的tarfile对象,我已经成功地做到了这一点。

我正在尝试一个管道实现,打开tarfile对象在‘w\gz’模式。到目前为止,我的代码如下:

代码语言:javascript
复制
from json import dump
from io import StringIO
import tarfile

with StringIO() as out_stream, tarfile.open(filename, 'w|gz', out_stream) as tar_file:
    for packet in json_io_format(data):
        dump(packet, out_stream)

这段代码位于一个函数'write_data‘中。“json_io_format”是一个生成器,它每次从数据集中返回一个dict对象(所以数据包就是dict)。

以下是我的错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "pdml_parser.py", line 35, in write_data
    dump(packet, out_stream)
  File "/.../anaconda3/lib/python3.5/tarfile.py", line 2397, in __exit__
    self.close()
  File "/.../anaconda3/lib/python3.5/tarfile.py", line 1733, in close
    self.fileobj.close()
  File "/.../anaconda3/lib/python3.5/tarfile.py", line 459, in close
    self.fileobj.write(self.buf)
TypeError: string argument expected, got 'bytes'

在通过注释帮助进行故障排除后,当' with‘语句退出并试图调用上下文管理器__exit__时,将导致错误。我相信这反过来又称为TarFile.close()。如果我从'with‘语句中删除tarfile.open()调用,并故意省略TarFile.close(),我将得到以下代码:

代码语言:javascript
复制
with StringIO() as out_stream:
    tarfile.open(filename, 'w|gz', out_stream) as tar_file:
    for packet in json_io_format(data):
        dump(packet, out_stream)

此版本的程序已完成,但未生成输出文件“filname”,并产生以下错误:

代码语言:javascript
复制
Exception ignored in: <bound method _Stream.__del__ of <targile._Stream object at 0x7fca7a352b00>>
Traceback (most recent call last):
  File "/.../anaconda3/lib/python3.5/tarfile.py", line 411, in __del__
    self.close()
  File "/.../anaconda3/lib/python3.5/tarfile.py", line 459, in close
    self.fileobj.write(self.buf)
TypeError: string argument expected, got 'bytes'

我相信这是垃圾收集器造成的。有些东西阻止了TarFile对象的关闭。

有人能帮我弄清楚这是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-23 20:26:33

为什么您认为可以将tarfile写到StringIO中?这不像你想的那样有效。

这种方法不会出错,但实际上并不是如何从内存中的对象创建内存中的tarfile。

代码语言:javascript
复制
from json import dumps                                                               
from io import BytesIO                                                     
import tarfile                                                                       

data = [{'foo': 'bar'},                                                              
        {'cheese': None},                                                            
        ]                                                                            

filename = 'fnord'                                                                   
with BytesIO() as out_stream, tarfile.open(filename, 'w|gz', out_stream) as tar_file:
    for packet in data:                                                              
        out_stream.write(dumps(packet).encode())                                     
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39109180

复制
相关文章

相似问题

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