【问题标题】:TypeError: a bytes-like object is required, not 'str' – Saving JSON data in PythonTypeError: a bytes-like object is required, not 'str' – 在 Python 中保存 JSON 数据
【发布时间】:2018-02-19 13:57:05
【问题描述】:

我从 twitter 获取 json 格式的数据并将其存储在一个文件中。

consumer_key = 'Consumer KEY'
consumer_secret = 'Secret'
access_token = 'Token'
access_secret = 'Access Secret'

auth = OAuthHandler(consumer_key, consumer_secret)

auth.set_access_token(access_token, access_secret)

api = tweepy.API(auth)

os.chdir('Path')
file = open('TwData.json','wb')

for status in tweepy.Cursor(api.home_timeline).items(15):
    simplejson.dump(status._json,file,sort_keys = True)
file.close

但我收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/Users/abc/anaconda/lib/python3.6/json/__init__.py", line 180, in dump
    fp.write(chunk)
TypeError: a bytes-like object is required, not 'str'

【问题讨论】:

  • 此代码无法生成此错误
  • @GhilasBELHADJ:当然可以。
  • 为什么要以二进制模式打开文件?您实际上也没有调用 file.close() 方法,就目前而言,该行相当多余。

标签: python json typeerror


【解决方案1】:

不要存储单独的 json 对象。将每个附加到列表中,然后立即转储。

with open('TwData.json','w') as file:    
    data = []
    for status in tweepy.Cursor(api.home_timeline).items(15):
        data.append(status._json)

    simplejson.dump(data, file, sort_keys=True)

这里还应注意,如果要向其写入文本,则不应以二进制模式打开文件。

【讨论】:

  • 非常有用..欣赏它
  • 我的错,我不知道这一点..想接受这两个,但由于我之前接受了 Martjin 的,它不让我接受你的..仍然对我同样有用..
  • @RiteshSatapathy 我不是告诉你要不要这样做,但为了将来参考,你必须先不接受一个答案才能接受另一个。因此,单击绿色复选标记以再次取消选中它。阅读:stackoverflow.com/help/someone-answersYou may change which answer is accepted, or simply un-accept the answer, at any time.
【解决方案2】:

来自json.dump() documentation

json 模块总是生成 str 对象,而不是 bytes 对象。所以fp.write()必须支持str输入。

您以二进制模式打开文件。不要那样做,从文件模式中删除b

file = open('TwData.json','w')

最好使用绝对路径而不是更改工作目录,并且如果您将文件用作上下文管理器(使用with 语句),当块完成时它会自动为您关闭。这有助于避免错误,例如忘记实际调用 file.close() 方法。

如果你打算将多个 JSON 文档写入文件,至少在每个文档之间放置一个 换行符,使其成为JSON lines file;这是much easier to parse again 稍后:

with open('Path/TWData.json', 'w') as file:    
    for status in tweepy.Cursor(api.home_timeline).items(15):
        json.dump(status._json, file, sort_keys=True)
        file.write('\n')

或者,将所有内容放入顶级对象(如映射或列表)中,然后将该单个对象写入文件以创建有效的 JSON 文档。

【讨论】:

  • 如果我们真的想要存储在二进制文件中怎么办?
  • @user32882 然后使用json.dumps() 生成一个字符串,然后将该字符串编码为字节。或者将二进制文件对象包装在TextIOWrapper instance 中,然后将该包装器传递给json.dump()。您可能想要设置write_through=True,并且不要忘记在完成后调用.detach()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2019-09-24
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多