编写json文件时出现Python类型错误

时间:2017-04-30 21:31:50

标签: python json unicode

我正在制作一本关于我们大都市区的字典。结构是这样的:

  {
  "Abilene": {
    "allCities": [
      "Abilene"
    ], 
    "latitude": "30.1588129", 
    "longName": "Abilene, TX Metropolitan Statistical Area", 
    "longitude": "-85.6602058", 
    "primaryState": "TX", 
    "states": [
      "TX"
    ]
  }, 

我想把这个字典写成一个以unicode编码的json文件,所以我导入了unicode文字和io包:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import io
from os.path import exists
import json
import unicodedata

我在unicode字符串中设置文字和值的键。

metropolitans[primaryCity] = {'allCities':allCities, 'longName':longName, 'allStates':states, 'primaryState':states[0]}

metropolitans[primaryCity]['longitude'] = unicode(str(coordinates[primaryCity]['longitude']), encoding = 'utf-8')

然后,我想将metropolitans保存到unicode的json文件中。

with io.open('results.json', 'w', encoding='utf-8') as results:
results.truncate()
json.dump(metropolitans, results, ensure_ascii=False, encoding='utf-8', results, indent=2, sort_keys=True)

而且,我收到了这个错误:

File "readMetropolitan.py", line 190, in <module>
json.dump(metropolitans, results, indent=2, sort_keys=True)
File "/usr/lib/python2.7/json/__init__.py", line 190, in dump
    fp.write(chunk)
TypeError: write() argument 1 must be unicode, not str

为什么?我知道我可以用&#39; wb&#39;完成一个文件。但我想用unicode写这个文件。

如果我使用dumps()和write():

,我可以写这个文件
s = json.dumps(metropolitans, ensure_ascii=False, encoding='utf-8', indent=2, sort_keys=True)
results.write(s)

1 个答案:

答案 0 :(得分:0)

您在错误代码上方发布的代码甚至没有运行,因为错误回溯表示在文件readMetropolitan.py中第190行运行此行时发生错误:

json.dump(metropolitans, results, indent=2, sort_keys=True)

您发布的代码是:

json.dump(metropolitans, ensure_ascii=False, encoding='utf-8', results, indent=2, sort_keys=True)

他们绝对不一样。也许代码是在编辑之前运行的?

错误回溯的前两行专门说明了触发错误的原因。

File "readMetropolitan.py", line 190, in <module>
json.dump(metropolitans, results, indent=2, sort_keys=True)
File "/usr/lib/python2.7/json/__init__.py", line 190, in dump
    fp.write(chunk)
TypeError: write() argument 1 must be unicode, not str

另外,在关键字参数之后,您不能拥有位置参数results。因此,它应该是:

json.dump(metropolitans, results, ensure_ascii=False, encoding='utf-8', indent=2, sort_keys=True)