python:修复写入json文件的数据中的转义unicode字符

时间:2018-02-22 15:58:56

标签: python json python-2.7 unicode utf-8

我遇到了我的程序问题。 我访问google places api并获取一个json,解析它并获取我感兴趣的值并将它们写入文件。我对google的api响应中的unicode字符有疑问。 我正在使用在Ubuntu 17.04上运行的python 2.7.13。

问题是API将字符串返回为:

  

Museo Nacional Centro de ArteReinaSofía

有一个特殊的字符:í

但是在文件中我发现了这个:

  

Museo Nacional Centro de Arte Reina Sof \ u00eda

从请求中获取数据并使用json.loads后,我在dict中获得unicode字符串,并从那里继续使用转义字符。 这是我的代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib2
import json

def getPlaces(category, country, city, url, token):
    requestURL = url.replace("CATEGORY", category)
    requestURL = requestURL.replace("CITY", city)

    if not (token is None):
        requestURL = requestURL + "&pagetoken=" + token

    jsonData = urllib2.urlopen(requestURL).read()
    data = json.loads(jsonData)
    result = []

    for item in data["results"]:
        result.append(getRowData(item, country, category))
    if "next_page_token" in data:
        nextToken = data["next_page_token"]
        result = result + getPlaces(category, country, city, url, nextToken)
    return result

def getRowData(item, country, category):
    lsit = []
    name = item["name"]
    lat = item["geometry"]["location"]["lat"]
    lng = item["geometry"]["location"]["lng"]
    return [country, category, name, lat, lng]

# def listToStr(lst):
#   result = '[ '
#   if lst[0] is 

def_url = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=CATEGORY+in+CITY&key=NOKEY:)"

attractions = getPlaces("museum", "Spain", "Madrid", def_url, None)

with open('data.txt', 'w') as outfile:
    json.dump(attractions, outfile)

我已经阅读了有关我正在使用的libs的主题和信息,但是我无法解决这个问题。

1 个答案:

答案 0 :(得分:-1)

也许你可以试试encode()。decode(),因为"Sof\u00eda".encode().decode()工作正常。

在您的代码中,我会像这样更改getRowData函数:

def getRowData(item, country, category):
    lsit = []
    name = item["name"]
    lat = item["geometry"]["location"]["lat"]
    lng = item["geometry"]["location"]["lng"]
    return [country.encode().decode(), category.encode().decode(), 
            name.encode().decode(), lat, lng]