2016-09-13 13 views
0

現在、JSON出力をAPIリクエストからCSV形式に変換しようとしています。結果をデータベースに保存できます。ここに参照のための私の現在のコードは次のとおりです。APIからAPIファイルからのJSON出力をCSVファイルに解析します

import pyodbc 
import csv 
#import urllib2 
import json 
import collections 
import requests 
#import pprint 
#import functools 

print ("Connecting via ODBC") 

conn = pyodbc.connect('DSN=DSN', autocommit=True) 

print ("Connected!\n") 

cur = conn.cursor() 

sql = """SELECT DATA""" 

cur.execute(sql) 

#df = pandas.read_sql_query(sql, conn) 

#df.to_csv('TEST.csv') 

#print('CSV sheet is ready to go!') 

rows = cur.fetchall() 

obs_list = [] 

for row in rows: 

    d = collections.OrderedDict() 
    d['addressee'] = row.NAME 
    d['street'] = row.ADDRESS 
    d['city'] = row.CITY 
    d['state'] = row.STATE 
    d['zipcode'] = row.ZIP 
    obs_list.append(d) 

obs_file = 'TEST.json' 
with open(obs_file, 'w') as file: 
    json.dump(obs_list, file) 


print('Run through API') 


url = 'https://api.smartystreets.com/street-address?' 

headers = {'content-type': 'application/json'} 

with open('test1.json', 'r') as run: 

    dict_run = run.readlines() 

    dict_ready = (''.join(dict_run)) 

r = requests.post(url , data=dict_ready, headers=headers) 

ss_output = r.text 

output = 'output.json' 

with open(output,'w') as of: 

    json.dump(ss_output, of) 

print('I think it works') 

f = open('output.json') 

    data = json.load(f) 

data_1 = data['analysis'] 

data_2 = data['metadata'] 

data_3 = data['components'] 

entity_data = open('TEST.csv','w') 

csvwriter = csv.writer(entity_data) 

count = 0 

count2 = 0 

count3 = 0 

for ent in data_1: 

    if count == 0: 

     header = ent.keys() 

     csvwriter.writerow(header) 

     count += 1 

    csvwriter.writerow(ent.values()) 

for ent_2 in data_2: 

    if count2 == 0: 

     header2 = ent_2.keys() 

     csvwriter.writerow(header2) 

     count2 += 1 

    csvwriter.writerow(ent_2.values()) 

for ent_3 in data_3: 

    if count3 == 0: 

     header3 = ent_3.keys() 

     csvwriter.writerow(header3) 

     count3 += 1 

    csvwriter.writerow(ent_3.values()) 

entity_data.close() 

出力例:

[ 
    { 
     "input_index": 0, 
     "candidate_index": 0, 
     "delivery_line_1": "1 Santa Claus Ln", 
     "last_line": "North Pole AK 99705-9901", 
     "delivery_point_barcode": "997059901010", 
     "components": { 
      "primary_number": "1", 
      "street_name": "Santa Claus", 
      "street_suffix": "Ln", 
      "city_name": "North Pole", 
      "state_abbreviation": "AK", 
      "zipcode": "99705", 
      "plus4_code": "9901", 
      "delivery_point": "01", 
      "delivery_point_check_digit": "0" 
     }, 
     "metadata": { 
      "record_type": "S", 
      "zip_type": "Standard", 
      "county_fips": "02090", 
      "county_name": "Fairbanks North Star", 
      "carrier_route": "C004", 
      "congressional_district": "AL", 
      "rdi": "Commercial", 
      "elot_sequence": "0001", 
      "elot_sort": "A", 
      "latitude": 64.75233, 
      "longitude": -147.35297, 
      "precision": "Zip8", 
      "time_zone": "Alaska", 
      "utc_offset": -9, 
      "dst": true 
     }, 
     "analysis": { 
      "dpv_match_code": "Y", 
      "dpv_footnotes": "AABB", 
      "dpv_cmra": "N", 
      "dpv_vacant": "N", 
      "active": "Y", 
      "footnotes": "L#" 
     } 
    }, 

    { 
     "input_index": 1, 
     "candidate_index": 0, 
     "delivery_line_1": "Loop land 1", 
     "last_line": "North Pole AK 99705-9901", 
     "delivery_point_barcode": "997059901010", 
     "components": { 
      "primary_number": "1", 
      "street_name": "Lala land", 
      "street_suffix": "Ln", 
      "city_name": "North Pole", 
      "state_abbreviation": "AK", 
      "zipcode": "99705", 
      "plus4_code": "9901", 
      "delivery_point": "01", 
      "delivery_point_check_digit": "0" 
     }, 
     "metadata": { 
      "record_type": "S", 
      "zip_type": "Standard", 
      "county_fips": "02090", 
      "county_name": "Fairbanks North Star", 
      "carrier_route": "C004", 
      "congressional_district": "AL", 
      "rdi": "Commercial", 
      "elot_sequence": "0001", 
      "elot_sort": "A", 
      "latitude": 64.75233, 
      "longitude": -147.35297, 
      "precision": "Zip8", 
      "time_zone": "Alaska", 
      "utc_offset": -9, 
      "dst": true 
     }, 
     "analysis": { 
      "dpv_match_code": "Y", 
      "dpv_footnotes": "AABB", 
      "dpv_cmra": "N", 
      "dpv_vacant": "N", 
      "active": "Y", 
      "footnotes": "L#" 
     } 
] 

トラブルがCSV形式に戻される出力(出力例)を解析しようとしているAPIの出力を格納した後。これを実行しようとする使用してコードイム:

f = open('output.json') 

data = json.load(f) 

data_1 = data['analysis'] 

data_2 = data['metadata'] 

data_3 = data['components'] 

entity_data = open('TEST.csv','w') 

csvwriter = csv.writer(entity_data) 

count = 0 

count2 = 0 

count3 = 0 

for ent in data_1: 

    if count == 0: 

     header = ent.keys() 

     csvwriter.writerow(header) 

     count += 1 

    csvwriter.writerow(ent.values()) 

for ent_2 in data_2: 

    if count2 == 0: 

     header2 = ent_2.keys() 

     csvwriter.writerow(header2) 

     count2 += 1 

    csvwriter.writerow(ent_2.values()) 

for ent_3 in data_3: 

    if count3 == 0: 

     header3 = ent_3.keys() 

     csvwriter.writerow(header3) 

     count3 += 1 

    csvwriter.writerow(ent_3.values()) 

entity_data.close() 

次のエラーが返されます。例外TypeError:文字列のインデックスは整数でなければなりません。誰かが親切にコメントして指摘したように、私は別の辞書の代わりにキーを繰り返しているように見えます。これは何をすべきかわからないために固まってしまいます。私の理解から、JSONはそれぞれJSONオブジェクトの3つの異なる配列に分割されているようですが、構造に応じて表示されませんか?私はコードの長さをお詫びしますが、私は達成しようとしているものに文脈のいくつかの類似点を求めています。

+0

このタイプエラーはどのようなものですか?エラーの原因となっていないコードとデータを除外してサンプルを絞り込み、読みやすくすることができますか? –

+0

"for ent in data_1:"と書くと、いくつかの辞書を繰り返すように思えますが、実際にはこの場合は辞書のキーを反復しています。そして、ent.keys()が実際には文字列であると言うと、それは動作しません。 – Bemmu

+0

何とかあなたがこれを求めているのは、答えるのが難しいことです。あなたが理解していない最初の点を見つけて、それを別の質問として提出できるかどうかを確認することを提案します。 – Bemmu

答えて

1

は、表形式のDF構造にネストされたアイテムを平坦化するパンダのjson_normalize()方法を考えてみましょう:

import pandas as pd 
from pandas.io.json import json_normalize 
import json 

with open('Output.json') as f: 
    data = json.load(f) 

df = json_normalize(data) 

df.to_csv('Output.csv') 

コンポーネントメタデータ、および分析値を対応するなる期間で区切られた接頭辞に注意してください。不要な場合は、列名の変更を検討してください。

JSON to CSV Output

0

jsonでリクエストのresult.textを保存しています。 result.textは文字列なので、jsonを通してそれを読み返すと、listの代わりに同じ1つの長い文字列が得られます。あなたが言及TypeError:string indices must be integersの原因だ

output = 'output.json' 
with open(output,'w') as of: 
    of.write(ss_output) 

:あるとしてresult.textを書くようにしてください。 残りのコードには複数の問題があります。

  1. JSONのデータは、あなたがこのようなリストの理解を必要とするdata_1、たとえば、その取得するdictsのリストです: data_1 = [x['analysis'] for x in data]

  2. あなたは同じcsvファイルに行の3種類を記述します。コンポーネント、メタデータと分析。それは本当に奇妙です。その後、data以上のアイテムを反復処理し、対応するcsv_writerに自分のフィールドを書き込み、オープン3 csv_writersデータの種類ごとに1:

おそらくあなたは、コードの後半を書き換える必要があります。

関連する問題