Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python JSON.loads中JSON文件的奇怪编码问题_Python_Json_Vim_Utf 8 - Fatal编程技术网

Python JSON.loads中JSON文件的奇怪编码问题

Python JSON.loads中JSON文件的奇怪编码问题,python,json,vim,utf-8,Python,Json,Vim,Utf 8,我有一个JSON文件,其中包含非ascii字符,主要是西班牙语重音元音。我已经将这个文件的编码设置为utf-8(使用vim和:set fileencoding=utf8) 此文件的摘录,可供参考: [ { "location": "SRID=4326;POINT(-1.7944444440000000 43.3798499999999976)", "description": "", "name": "Fuenterrabía", "_id": 162 }

我有一个JSON文件,其中包含非ascii字符,主要是西班牙语重音元音。我已经将这个文件的编码设置为utf-8(使用vim和:set fileencoding=utf8)

此文件的摘录,可供参考:

[
  {
    "location": "SRID=4326;POINT(-1.7944444440000000 43.3798499999999976)",
    "description": "",
    "name": "Fuenterrabía",
    "_id": 162
  },
...
]
注意name字段中的'í'

这就是说,我需要在代码中创建这些元素的iterable,因此在最后我将其发送到FactoryBoy工厂类的create方法。事情是,在这个过程中,角色被搞乱了,我得到了一个不知名的:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 143: ordinal not in range(128)
查看解析文件的代码:

    def _get_spot_data(self, filename):
        data_file = str(settings.ROOT_DIR('fixtures/meteo/'+filename))
        # Open file with utf-8 encoding
        f = codecs.open(data_file, 'r', 'utf8')
        data = simplejson.loads(f.read(), 'utf-8')
        return data
查看列表的第一个位置(用于参考的位置),我得到:

{u'_id': 162, u'location': u'SRID=4326;POINT(-1.7944444440000000 43.3798499999999976)', u'name': u'Fuenterrab\xeda', u'description': u''}
如您所见,看起来我得到的是一个字节表示的'í'字符

我尝试过只使用open而不是codecs.open,尝试过使用json.loads而不是simplejson,但是没有任何效果…我在这里做错了什么

编辑:试图创建一个虚拟条目,以查看是否出现了相同的错误……因此我猜FactorBoy出现了一些问题:

dummy_one = {u'surfspot_id': 162, u'location': u'SRID=4326;POINT(-1.7944444440000000 43.3798499999999976)', u'name': u'Fuenterrabía', u'description': u''}
SpotFactory(**dummy_one)
然后错误会再次抛出

Traceback (most recent call last):
  File "/usr/lib/python2.7/logging/handlers.py", line 76, in emit
    if self.shouldRollover(record):
  File "/usr/lib/python2.7/logging/handlers.py", line 156, in shouldRollover
    msg = "%s\n" % self.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 732, in format
    return fmt.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 474, in format
    s = self._fmt % record.__dict__
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 143: ordinal not in range(128)
Logged from file base.py, line 397 
我必须说这不是一个阻塞问题,只是一个警告异常,但我不希望看到它,希望输出是干净的

谢谢

这很有效:

import json

with open(r'your/data.json') as f:
    data = json.load(f, encoding='utf-8')
    name = data[0]['name']

    print name
    print len(name)
    print name[-2:-1]
印刷品:

Fuenterrabía 12 í 仍打印为:

{ u'_id': 162, u'location': u'SRID=4326;POINT(-1.7944444440000000 43.3798499999999976)', u'name': u'Fuenterrab\xeda', u'description': u'' } { 身份证号码:162, u‘位置’:u‘SRID=4326;点(-1.794440000000 43.3798499999976), u'name':u'fuenterab\xeda', u'description':u' } 不要被输出愚弄,字符串本身是Unicode,包含正确的字符。

这很好:

import json

with open(r'your/data.json') as f:
    data = json.load(f, encoding='utf-8')
    name = data[0]['name']

    print name
    print len(name)
    print name[-2:-1]
印刷品:

Fuenterrabía 12 í 仍打印为:

{ u'_id': 162, u'location': u'SRID=4326;POINT(-1.7944444440000000 43.3798499999999976)', u'name': u'Fuenterrab\xeda', u'description': u'' } { 身份证号码:162, u‘位置’:u‘SRID=4326;点(-1.794440000000 43.3798499999976), u'name':u'fuenterab\xeda', u'description':u' }
不要被这个输出愚弄了,字符串本身是Unicode,包含正确的字符。

我不明白。您是说“加载”会引发异常UnicodeDecodeError吗?如果是这样,那么您给出的“查看列表的第一个位置…”的示例是什么?这不是“负载”的结果吗?不是。这是由我从FactoryBoy获得的工厂的create方法在之后提出的,但它是传递unicode字符'í'的字节表示的结果……附带问题是JSON文件是否有BOM表?@Tomalak您是指文件开头的编码?不,不需要,我已经使用vim为该文件指定了字符编码…我需要BOM是还是是?不,你绝对不需要,为UTF-8文件设置BOM是可能的,但这是错误的。vim有一个选项(
:h bomb
),您可以将其与
fenc
分开设置,这就是我问的原因。我不明白。您是说“加载”会引发异常UnicodeDecodeError吗?如果是这样,那么您给出的“查看列表的第一个位置…”的示例是什么?这不是“负载”的结果吗?不是。这是由我从FactoryBoy获得的工厂的create方法在之后提出的,但它是传递unicode字符'í'的字节表示的结果……附带问题是JSON文件是否有BOM表?@Tomalak您是指文件开头的编码?不,不需要,我已经使用vim为该文件指定了字符编码…我需要BOM是还是是?不,你绝对不需要,为UTF-8文件设置BOM是可能的,但这是错误的。vim有一个选项(
:h bomb
),您可以将其与
fenc
分开设置,这就是为什么我要问的原因。谢谢,但是为什么从工厂/django.py创建方法失败了呢?异常被抛出,当我像上面那样传递字典时…我不知道。当您在Python脚本中手工制作一个伪数据而不是从JSON文件中检索它时,它是否接受数据?是的,看起来很像FactoryBoy中的一个问题。谢谢,但是为什么_createmethod from factory/django.py失败了?异常被抛出,当我像上面那样传递字典时…我不知道。当您在Python脚本中手工制作一个虚拟数据而不是从JSON文件中检索数据时,它是否接受数据?是的,看起来很像FactoryBoy中的一个问题。