gpt4 book ai didi

Python 尝试附加 JSON 文件时出错

转载 作者:行者123 更新时间:2023-11-30 22:12:05 25 4
gpt4 key购买 nike

我对 Python 比较陌生,所以我的问题可能很容易解决,但经过几天的尝试和搜索互联网后我找不到任何东西。

因此,我构建了一个脚本来从 Twitter 传输数据,并将收集到的数据存储到 json 文件中,以便我稍后可以访问它并执行任何操作。该脚本从单独的文件中提取用户凭据,例如消费者 key 、 token 和访问信息来进行身份验证(我确信有一个更好、更安全的方法来做到这一点,这只是一个概念证明)使用此代码:

with open('Twitter_Credentials.json', mode = 'a+') as tc:
data = json.load(tc)
if user not in data['names']:
user_dict = dict()
user_dict[user] = {'key':'','secret':'','token':'','token_secret':''}
user_dict[user]['key'] = input('Twitter Consumer Key: ')
user_dict[user]['secret'] = input('Twitter Consumer Secret: ')
user_dict[user]['token'] = input('Twitter Access Token: ')
user_dict[user]['token_secret'] = input('Twitter Access Secret: ')
data['names'].append(user_dict)
json.dump(data,tc, indent = 2, ensure_ascii = False)
tc.close()

我遇到的问题是,如果我想将另一个用户及其凭据附加到此文件中,我会不断收到此错误:

File "(filepath)", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我已经尝试过的事情:

  • 使用 'r''r+''w''w+' 修改模式
  • load()dump() 更改为 loads()dumps()
  • 更改编码

使用'r+''w+'并没有给我带来错误,但它确实复制了原始用户,因此它们出现了多次。我想消除它,这样当它附加时它就不会重复。任何见解将不胜感激。提前致谢。

最佳答案

JSON 文件是包含单个 JSON 文档的文件。如果您向其中附加另一个 JSON 字符串,它就不再是 JSON 文件。

the docs说:

Note Unlike pickle and marshal, JSON is not a framed protocol, so trying to serialize multiple objects with repeated calls to dump() using the same fp will result in an invalid JSON file.

<小时/>

如果您实际上并没有尝试在一个文件中存储多个文档,解决方法很简单:您要做的就是打开文件,加载它,修改数据,然后打开重新文件并覆盖它。像这样:

with open('Twitter_Credentials.json', mode = 'r') as tc:
data = json.load(tc)
if user not in data['names']:
# blah blah
with open('Twitter_Credentials.json', mode = 'w') as tc:
json.dump(data, tc, indent = 2, ensure_ascii = False)

请注意,我使用的是 w 模式,而不是 a,因为我们想要用新文件覆盖旧文件,而不是在其末尾添加内容.

<小时/>

如果您尝试存储多个文档,则无法使用 JSON 来做到这一点。幸运的是,有一些非常简单且常用的基于 JSON 的框架协议(protocol)(JSONlines、NDJ 等)。此类格式有三四种,略有差异,但所有这些格式的关键是每个 JSON 文档都单独占一行,文档之间有换行符。

但是使用 ensure_ascii=False 意味着您不会转义字符串中的换行符,而 indent=2 意味着您在文档中的字段之间添加更多换行符,并且那么你就不会做任何事情来在每个文档后写入换行符。因此,您的输出既不是有效的 JSONlines,也不是有效的 JSON。

此外,即使您修复了所有这些问题,您也只是执行一个 json.load,它只会从 JSONlines 文件中读取第一个文档,然后执行 json.load。 dump 到同一个文件,这会在该文件之后写入第二个文档,覆盖那里的任何内容。您很容易最终会覆盖前第二个文档的一半,而将另一半作为垃圾留在后面供以后阅读。所以,你需要重新思考你的逻辑。至少,您想要执行与上面相同的操作,打开文件两次:

with open('Twitter_Credentials.json', mode = 'r') as tc:
data = json.load(tc)
if user not in data['names']:
# blah blah
with open('Twitter_Credentials.json', mode = 'a') as tc:
json.dump(data, tc)
tc.write('\n')

这次我使用 a 模式,因为这次我们确实想要在现有文件的末尾添加一个新行。

关于Python 尝试附加 JSON 文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com