2

我正在使用googlemaps Python 包进行反向地理编码。观察:

PS Z:\dev\poc\SDR> python
Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from googlemaps import GoogleMaps
>>> gmaps = GoogleMaps("*** my google API key ***")
>>> d=gmaps.reverse_geocode(51.75,19.46667)
>>> d
{u'Status': {u'code': 200, u'request': u'geocode'}, u'Placemark': [{u'Point': {u'coordinates': [19.466876, 51.7501456, 0]}, u'ExtendedData': {u'LatLonBox': {u'west': 19.465527, u'east': 19.468225, u'n
orth': 51.7514946, u'south': 51.7487966}}, u'AddressDetails': {u'Country': {u'CountryName': u'Polska', u'AdministrativeArea': {u'SubAdministrativeArea': {u'SubAdministrativeAreaName': u'\u0141\xf3d\u0
17a', u'Locality': {u'Thoroughfare': {u'ThoroughfareName': u'ksi\u0119dza Biskupa Wincentego Tymienieckiego 16'}, u'LocalityName': u'\u0141\xf3d\u017a'}}, u'AdministrativeAreaName': u'\u0142\xf3dzkie'
}, u'CountryNameCode': u'PL'}, u'Accuracy': 8}, u'id': u'p1', u'address': u'ksi\u0119dza Biskupa Wincentego Tymienieckiego 16, 90-001 \u0141\xf3d\u017a, Poland'}], u'name': u'51.750000,19.466670'}
>>> import pprint
>>> pp = pprint.PrettyPrinter(indent = 2)
>>> pp.pprint(d)
{ u'Placemark': [ { u'AddressDetails': { u'Accuracy': 8,
                                         u'Country': { u'AdministrativeArea': { u'AdministrativeAreaName': u'\u0142\xf3dzkie',
                                                                                u'SubAdministrativeArea': { u'Locality': { u'LocalityName': u'\u0141\xf3d\u017a',
                                                                                                                           u'Thoroughfare': { u'ThoroughfareName': u'ksi\u0119dza Biskupa Wincentego Tym
ienieckiego 16'}},
                                                                                                            u'SubAdministrativeAreaName': u'\u0141\xf3d\u017a'}},
                                                       u'CountryName': u'Polska',
                                                       u'CountryNameCode': u'PL'}},
                    u'ExtendedData': { u'LatLonBox': { u'east': 19.468225,
                                                       u'north': 51.7514946,
                                                       u'south': 51.7487966,
                                                       u'west': 19.465527}},
                    u'Point': { u'coordinates': [19.466876, 51.7501456, 0]},
                    u'address': u'ksi\u0119dza Biskupa Wincentego Tymienieckiego 16, 90-001 \u0141\xf3d\u017a, Poland',
                    u'id': u'p1'}],
  u'Status': { u'code': 200, u'request': u'geocode'},
  u'name': u'51.750000,19.466670'}

现在,我想将d字典保存到文件中,但我不想将其u'\u0141\xf3d\u017a'视为地区名称。我想看看Łódź。确实:

所以,我试过这个:

with codecs.open("aa.txt", "w", "utf-8") as f:
  f.write(unicode(d))

还有这个:

with codecs.open("aa.txt", "w", "utf-8") as f:
  f.write(unicode(str(d), "utf-8"))

还有这个:

with open("aa.txt", "w") as f:
  f.write(unicode(d))

当然,没有任何效果。所有的试验都产生了\u0141\xf3d\u017a。如何正确保存?

4

3 回答 3

3

传给使用。ensure_ascii=False_json.dump*()codecs.open()

于 2012-04-19T15:36:08.483 回答
3

第一种形式适合将 unicode 写入文件:

>>> s = u'\u0141\xf3d\u017a'
>>> with codecs.open('aa.txt', 'w', 'utf-8') as f:
...     f.write(s)
... 
>>> with codecs.open('aa.txt', 'r', 'utf-8') as f:
...     print f.read()
... 
Łódź

发生的事情是,当您使用 unicode(d) 时,您正在保存字典的表示形式。

>>> unicode(d)
u"{u'locality': u'\\u0141\\xf3d\\u017a'}"

这相当于:

>>> unicode(repr(d))
u"{u'locality': u'\\u0141\\xf3d\\u017a'}"

因此,您并没有真正将 Łódź 写到文件中。请注意,原始转义序列已转义。u'\u0141' 是 Ł 字符,但 u'\u0141' 是 6 个字符的字符串。

由于 Python 字典没有不会进行转义的 unicode 表示,因此您应该使用更好的序列化方法。如果将读取文件的应用程序支持它,则使用 json 应该没问题。

如果您确实需要将其写入不支持相同序列化方法的其他应用程序可读的文件中,则必须遍历 dict 并一次写下键、值对,而不是表示。

于 2012-04-19T15:59:25.883 回答
1

文件是字节流,因此您的 unicode 需要在保存到文件之前进行编码(表示为字节)。现在,当打开(从文件中读取数据)时,您需要使用相同的解码(编码)方案,例如 utf-8 将数据解码回 unicode

小心在文件中写入对象的序列化,而不是它的表示。使用 json.dumps(d) 获取序列化并使用 json.loads(filecontent) 将其读回

于 2012-04-19T15:36:24.087 回答