2012-04-19 2 views
2

逆ジオコーディングを行うにはgooglemaps pythonパッケージを使用しています。守って :utf-8文字列を含む辞書を正しくファイルに保存するには

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źを見たいと思う。実際:u017a \ http://www.fileformat.info/info/unicode/char/00f3/index.htm

  • - - - XF3 = \ u00f3 \ http://www.fileformat.info/info/unicode/char/0141/index.htm
  • だから、私はこれを試してみました:

    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である。それを正しく保存するのを助けてください。

  • +0

    '\ u'コーディングは、あなたが好きか否かにかかわらず、常に' dict'の 'repr'の一部です。 JSONを出力フォーマットとして使用することを検討してください。 –

    答えて

    3

    ensure_ascii=False~json.dump*()を使用し、codecs.open()を使用してください。

    1

    ファイルはバイトストリームであるため、ファイルに保存する前にユニコードをエンコードする必要があります(バイトで表現)。 これで、ファイルからデータを読み込むときに、デコード(エンコード)スキームを使用して、データをユニコードにデコードする必要があります。 utf-8

    オブジェクトのシリアル化は、ファイルの内部ではなく、その表現ではなく、注意して記述してください。最初の形式は、ファイルにUnicodeを書き込むために右である

    3

    に戻ってそれを読むためにシリアライズとjson.loads(含むFileContent)を得るためにjson.dumps(d)を使用します。happenning何

    >>> 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ź 
    

    はあなたということですあなたがユニコード(d)を使うとき、辞書のための表現を保存しています。

    と同等です
    >>> unicode(d) 
    u"{u'locality': u'\\u0141\\xf3d\\u017a'}" 
    

    :だから

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

    、あなたが本当にファイルへのヴィスワを書き留めていません。オリジナルのエスケープシーケンスがエスケープされていることに注意してください。 u '\ u0141'は£charですが、u '\ u0141'は6文字の文字列です。

    Python辞書にはエスケープしないユニコード表現がないので、より良い直列化方法を使用する必要があります。ファイルを読み取るアプリケーションがそれをサポートしている場合、jsonを使用するのは問題ありません。

    同じシリアル化メソッドをサポートしていない他のアプリケーションで読み込み可能なファイルに書き留める必要がある場合は、dictを繰り返し実行し、キー、値のペアを一度に1つずつ書き留める必要があります表現。

    関連する問題