gpt4 book ai didi

python - Unicode API 响应抛出错误 '' ascii' 编解码器无法编码字符 u'\u201 9' in position 22462'

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:02 24 4
gpt4 key购买 nike

我正在进行 API 调用,响应包含 unicode 字符。将此响应加载到文件中会引发以下错误:

'ascii' codec can't encode character u'\u2019' in position 22462

我已经尝试了解码和编码('utf-8')的所有组合。

这是代码:

url = "https://%s?start_time=%s&include=metric_sets,users,organizations,groups" % (api_path, start_epoch)
while url != None and url != "null" :
json_filename = "%s/%s.json" % (inbound_folder, start_epoch)
try:
resp = requests.get(url,
auth=(api_user, api_pwd),
headers={'Content-Type': 'application/json'})

except requests.exceptions.RequestException as e:
print "|********************************************************|"
print e
return "Error: {}".format(e)
print "|********************************************************|"
sys.exit(1)

try:
total_records_extracted = total_records_extracted + rec_cnt
jsonfh = open(json_filename, 'w')
inter = resp.text
string_e = inter#.decode('utf-8')
final = string_e.replace('\\n', ' ').replace('\\t', ' ').replace('\\r', ' ')#.replace('\\ ',' ')
encoded_data = final.encode('utf-8')
cleaned_data = json.loads(encoded_data)
json.dump(cleaned_data, jsonfh, indent=None)
jsonfh.close()
except ValueError as e:
tb = traceback.format_exc()
print tb
print "|********************************************************|"
print e
print "|********************************************************|"
sys.exit(1)

很多开发者都面临过这个问题。很多地方要求使用 .decode('utf-8') 或在顶部添加 # _*_coding:utf-8 _*_ Python。

仍然没有帮助。

有人可以帮我解决这个问题吗?

这是跟踪:

Traceback (most recent call last):
File "/Users/SM/PycharmProjects/zendesk/zendesk_tickets_api.py", line 102, in main
cleaned_data = json.loads(encoded_data)
File "/Users/SM/anaconda/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/Users/SM/anaconda/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/SM/anaconda/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid \escape: line 1 column 2826494 (char 2826493)

|********************************************************|
Invalid \escape: line 1 column 2826494 (char 2826493)

最佳答案

inter = resp.text
string_e = inter#.decode('utf-8')
encoded_data = final.encode('utf-8')

text 属性是一个 Unicode 字符串,使用请求模块猜测的 HTTP header 中可能使用的任何编码从原始字节解码。

你可能不想要这样; JSON 对于编码应该是什么有自己的想法,因此您应该让 JSON 解码器通过从 resp.content 获取原始响应字节并将它们直接传递到 json.loads.

此外,Requests 有一个快捷方法可以执行相同的操作:resp.json()

final = string_e.replace('\\n', ' ').replace('\\t', ' ').replace('\\r', ' ')#.replace('\\ ',' ')

尝试在 JSON 字符串文字格式的输入上执行此操作是一个坏主意:您将错过一些有效的转义,并错误地取消转义其他转义。您的实际错误与 Unicode 完全无关,而是此替换正在破坏输入。例如,考虑输入 JSON:

{"message": "Open the file C:\\newfolder\\text.txt"}

更换后:

{"message": "Open the file C:\ ewfolder\ ext.txt"}

这显然不是有效的 JSON。

您应该让 json 对输入进行解码,然后过滤结构化输出中的任何字符串,而不是尝试对 JSON 编码的字符串进行操作。这可能涉及使用递归函数深入到数据的每个级别,查找要过滤的字符串。例如

def clean(data):
if isinstance(data, basestring):
return data.replace('\n', ' ').replace('\t', ' ').replace('\r', ' ')
if isinstance(data, list):
return [clean(item) for item in data]
if isinstance(data, dict):
return {clean(key): clean(value) for (key, value) in data.items()}
return data

cleaned_data = clean(resp.json())

关于python - Unicode API 响应抛出错误 '' ascii' 编解码器无法编码字符 u'\u201 9' in position 22462',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37847386/

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