Python 2.7修复写入JSON文件时的转义Unicode字符问题
解决Python 2.7中写入含Unicode字符文本时的转义问题
我之前也踩过Python 2.7里这种Unicode转义的坑,处理API返回的特殊字符时简直头大!咱们一步步来搞定你的问题:
问题根源
Python 2.7里字符串分两种:str(字节串)和unicode(Unicode文本)。你从Google Places API拿到JSON解析后,提取的特殊字符(比如í)其实是unicode类型,但如果直接用默认的open()函数写入文件,Python会默认用ASCII编码保存——ASCII不支持这些特殊字符,所以就自动转成了\u00ed这种转义形式。
解决方案
1. 确保JSON解析得到的是Unicode文本
首先要保证你从API返回的JSON里解析出的内容是unicode类型,而不是乱码的字节串:
- 如果用
urllib2请求API:import urllib2 import json # 发送请求并读取响应 response = urllib2.urlopen("你的Google Places API地址") # 先把字节响应解码成Unicode文本 content_unicode = response.read().decode('utf-8') # 解析JSON,得到的内容都是Unicode类型 data = json.loads(content_unicode) - 如果用
requests库(更推荐):import requests response = requests.get("你的Google Places API地址") # response.json()会自动处理编码,返回的是Unicode组成的字典 data = response.json()
2. 正确写入文件(两种方法任选)
方法一:用codecs模块指定编码打开文件
codecs.open()可以直接指定编码,写入unicode字符串时会自动转成对应编码的字节,不会出现转义:
import codecs # 提取你需要的Unicode文本,比如地点名称 place_name = data['results'][0]['name'] # 用utf-8编码打开文件,写入Unicode文本 with codecs.open('output.txt', 'w', encoding='utf-8') as f: f.write(place_name)
方法二:手动编码后写入普通文件
如果不想用codecs,可以先把unicode字符串编码成UTF-8的字节串,再用普通open()写入:
place_name = data['results'][0]['name'] # 把Unicode编码成UTF-8字节串 place_name_utf8 = place_name.encode('utf-8') with open('output.txt', 'w') as f: f.write(place_name_utf8)
额外注意事项
- 永远在Python 2.7里明确区分
str和unicode:处理文本时尽量用unicode类型,最后写入/输出时再编码成UTF-8字节串。 - 如果你提取的内容不小心是
str类型(比如解析时没处理编码),先把它解码成unicode:str_text.decode('utf-8'),再按上面的方法写入。
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

