2016-03-29 9 views
0

APIからJSONデータを取得するためにPython 2.7.11を使用しています(ワルシャワ、ポーランドの木に関するデータですが、それは気にしません)。さらなる分析のために、APIによって提供されるすべてのデータを含む出力csvファイルを生成したいと思います。私はfor another project(ここでStackoverflowで議論され、@Martin Taylorによって修正されました)スクリプトを使い始めました。このスクリプトはうまくいかなかったので、私は非常に基本的な理解、グーグルでpdbデバッガを使って修正しようとしました。現時点では、結果は次のようになります。PythonでAPIを解析する - BOMでJSONを処理する方法

import pdb 
import json 
import urllib2 
import csv 

pdb.set_trace() 
url = "https://api.um.warszawa.pl/api/action/datastore_search/?resource_id=ed6217dd-c8d0-4f7b-8bed-3b7eb81a95ba" 
myfile = 'C:/dane/drzewa.csv' 
csv_myfile = csv.writer(open(myfile, 'wb')) 
cols = ['numer_adres', 'stan_zdrowia', 'y_wgs84', 'dzielnica', 'adres', 'lokalizacja', 'wiek_w_dni', 'srednica_k', 'pnie_obwod', 'miasto', 'jednostka', 'x_pl2000', 'wysokosc', 'y_pl2000', 'numer_inw', 'x_wgs84', '_id', 'gatunek_1', 'gatunek', 'data_wyk_pom'] 
csv_myfile.writerow(cols)  


def api_iterate(myfile): 
    while True: 
     global url 
     print url 
     json_page = urllib2.urlopen(url) 
     data = json.load(json_page) 
     json_page.close() 

     for data_object in data ['result']['records']: 
      csv_myfile.writerow([data_object[col] for col in cols]) 

     try: 
      url = data['_links']['next']  
     except KeyError as e: 
      break 

with open(myfile, 'wb'): 
    api_iterate(myfile) 

私は非常に新鮮なPythonユーザーですので、私はずっと混乱しています。今、私は、json辞書のオブジェクトを読み込んでいるときに、 'x_wgs84'要素に関連付けられたKeyerrorメッセージを取得します。私は、ソースURLにこの要素の前にU + FEFFのUnicode文字があるという事実と関係があると思います。私はこれを回避しようとしたが、私は立ち往生し、支援に感謝します。

私が言及したように、コードは他のいくつかの方法で壊れている可能性があります。私は非常に未熟なプログラマーです。

答えて

0

あなたはユニコード文字でキーを配置する必要があります:あなたがあなたのを得るために、見ることができるように

>>> import requests 
>>> res = requests.get('https://api.um.warszawa.pl/api/action/datastore_search/?resource_id=ed6217dd-c8d0-4f7b-8bed-3b7eb81a95ba') 
>>> data = res.json() 
>>> records = data['result']['records'] 
>>> records[0] 
{u'numer_adres': u'', u'stan_zdrowia': u'dobry', u'y_wgs84': u'52.21865', u'y_pl2000': u'5787241.04475524', u'adres': u'ul. ALPEJSKA', u'x_pl2000': u'7511793.96937063', u'lokalizacja': u'Ulica ALPEJSKA', u'wiek_w_dni': u'60', u'miasto': u'Warszawa', u'jednostka': u'Dzielnica Wawer', u'pnie_obwod': u'73', u'wysokosc': u'14', u'data_wyk_pom': u'20130709', u'dzielnica': u'Wawer', u'\ufeffx_wgs84': u'21.172584', u'numer_inw': u'D386200', u'_id': 125435, u'gatunek_1': u'Quercus robur', u'gatunek': u'd\u0105b szypu\u0142kowy', u'srednica_k': u'7'} 
>>> records[0].keys() 
[u'numer_adres', u'stan_zdrowia', u'y_wgs84', u'y_pl2000', u'adres', u'x_pl2000', u'lokalizacja', u'wiek_w_dni', u'miasto', u'jednostka', u'pnie_obwod', u'wysokosc', u'data_wyk_pom', u'dzielnica', u'\ufeffx_wgs84', u'numer_inw', u'_id', u'gatunek_1', u'gatunek', u'srednica_k'] 
>>> records[0][u'\ufeffx_wgs84'] 
u'21.172584' 

:1つの簡単な方法は、キーを印刷することで、それを行う方法を知るために

あなたが問題を引き起こしているユニコード文字で'\ufeffx_wgs84'と書く必要があります。

注:python2または3を使用しているかどうかはわかりませんが、Python2の文字列宣言の前にuを置いて、Unicode文字列として宣言する必要があります。

+0

ありがとうございます@Cybril、私はすでにそれを試みました。前述のように、私はPython 2.7.11を使用しています。私はchanfe 'x_wgs84'を '\ ufeffx_wgs84'にしようとしましたが、これは問題を解決しませんでした。エラー応答もまったく同じでした。私は文字列の前に 'u'を置くことで何を意味するのか分かりません - あなたは 'u'feffx_wgs_84'や 'u' \ feffx_wgs_84 'のような意味ですか?これはどちらもうまくいかないようです。 – Jan

+0

私の例を見てください。引用符の前に置くことです。 – Cyrbil

+0

申し訳ありません@Cybril、今私はそれを手に入れます。 UnicodeEncodeError: 'ascii'コーデックは文字 'ufeff'を位置0にエンコードできません:序数は範囲内にありません(128)。これは実際に変更されました。 :)おそらく、私が読んだとおり、自動的にエンコードの問題を処理する要求を使用したからです。 – Jan

関連する問題