2016-11-21 169 views
0

IA具有不断更新以下数据容器:UnicodeEncodeError:“ASCII”编解码器不能编码

data = [] 
     for val, track_id in zip(values,list(track_ids)): 
      #below 
      if val < threshold: 
       #structure data as dictionary 
       pre_data = {"artist": sp.track(track_id)['artists'][0]['name'], "track":sp.track(track_id)['name'], "feature": filter_name, "value": val} 
       data.append(pre_data) 
     #write to file 
     with open('db/json/' + user + '_' + product + '_' + filter_name + '.json', 'w') as f: 
      json.dump(data,f, ensure_ascii=False, indent=4, sort_keys=True) 

,但我越来越喜欢这个有很多的错误:

json.dump(data,f, ensure_ascii=False, indent=4, sort_keys=True) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 190, in dump fp.write(chunk) UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 6: ordinal not in range(128)

有没有办法摆脱这种编码问题一劳永逸?

有人告诉我,这将做到这一点:

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

但很多人不建议这样做。

我用python 2.7.10

任何线索?

+0

显示完整的错误跟踪,所以我们可以看到错误来自哪里。这是Python 2还是3? –

+0

'sys.setdefaultencoding'可能在Python2中工作,但在Python3中不存在。它可以与'print()'一起使用,但不能与写入文件等其他内容一起使用,因此您必须显示完整的错误消息和产生问题的行。 – furas

+0

@MarkRansom更新,谢谢 –

回答

0

当您写入以文本模式打开的文件时,Python会为您编码该字符串。默认编码是ascii,它会产生您看到的错误;有一个很多字符不能被编码为ASCII。

解决方案是以不同的编码打开文件。在Python 2中,您必须使用codecs模块,在Python 3中,您可以将encoding=参数直接添加到openutf-8是一个流行的选择,因为它可以处理所有的Unicode字符,并且对于JSON来说它是标准的;见https://en.wikipedia.org/wiki/JSON#Data_portability_issues

import codecs 
with codecs.open('db/json/' + user + '_' + product + '_' + filter_name + '.json', 'w', encoding='utf-8') as f: 
+0

您击败了我! [RFC](https://tools.ietf.org/html/rfc7159#section-8.1)只允许utf-8,utf-16和utf-32编码,但对后两种编码设置了限制(例如没有BOM)并暗示utf-8是唯一可以互操作的方法。 'mbcs'会违反rfc。我认为JSON只是utf-8,并且对其他编码甚至被允许感到惊讶。 – tdelaney

+0

@tdelaney我从来没有直接处理过JSON,所以我不知道字符集限制,谢谢!我会编辑答案。 –

0

为什么不编码特定的字符串呢?对引发异常的字符串尝试使用.encode('utf-8')方法。

1

你的对象有unicode字符串和python 2.x对unicode的支持可能有点多余。首先,让我们做演示该问题很短的例子:

>>> obj = {"artist":u"Björk"} 
>>> import json 
>>> with open('deleteme', 'w') as f: 
...  json.dump(obj, f, ensure_ascii=False) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "/usr/lib/python2.7/json/__init__.py", line 190, in dump 
    fp.write(chunk) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 3: ordinal not in range(128) 

json.dump帮助文本:

啊!有解决方案。使用默认的ensure_ascii=True并获取ascii转义的unicode字符或使用codecs模块以您想要的编码打开文件。这工作:

>>> import codecs 
>>> with codecs.open('deleteme', 'w', encoding='utf-8') as f: 
...  json.dump(obj, f, ensure_ascii=False) 
... 
>>> 
相关问题