crompnk
asked on
Extracting data from a dictionary object to csv using Python 3.4
Hi, I'd like some help with the syntax to extract data from a dictionary object into csv. Below is the code so far and the required csv output. I can use the script to print the data but just want to modify it now to export the data.
Thanks
Thanks
import urllib.request
import json
import sqlite3
import decimal
import csv
decimal.getcontext().prec = 2
HOST = "http://datapoint.metoffice.gov.uk/public/data"
KEY = '...................................'
# Data categories
VAL = "val" # Location-specific data
TEXT = "txt" # Textual data
IMAGE = "image" # Stand-alone imagery
LAYER = "layer" # Map overlay imagery
# Resource type: forecast or observation
FORECAST = "wxfcs"
OBSERVATIONS = "wxobs"
# Field
ALL = "all" # Can also be used instead of a location ID
DATA_TYPE = "json" # Easier to work with than the XML alternative
# Time steps
DAILY = "daily"
THREE_HOURLY = "3hourly"
HOURLY = "hourly"
#Location ID
LOCATION = "3002"
url = (HOST + '/' + VAL + '/' + OBSERVATIONS + '/' + ALL + '/' + DATA_TYPE + '/' + LOCATION + '?' + 'res=' + HOURLY + '&key=' + KEY)
print (url)
### THIS IS THE CALL TO GET THE MET OFFICE FILE FROM THE INTERNET
response = urllib.request.urlopen(url)
FCData = response.read()
FCDataStr = FCData.decode('utf-8')
### END OF THE CALL TO GET MET OFFICE FILE FROM THE INTERNET
#Converts JSON data to a dictionary object
FCData_Dic = json.loads(FCDataStr)
#The following are examples of extracting data from the dictionary object.
#The JSON data is heavily nested.
#Each [] goes one level down, usually defined with {} in the JSON data.
dataDate = (FCData_Dic['SiteRep']['DV']['dataDate'])
print('dataDate =',dataDate)
#Get the Location info
LocationID = (FCData_Dic['SiteRep']['DV']['Location'].get('i',''))
print('LocationID =',LocationID)
Lat = (FCData_Dic['SiteRep']['DV']['Location'].get('lat',''))
print('Lat =',Lat)
Lon = (FCData_Dic['SiteRep']['DV']['Location'].get('lon',''))
print('Lon =',Lon)
Name = (FCData_Dic['SiteRep']['DV']['Location'].get('name',''))
print('Name =',Name)
Country = (FCData_Dic['SiteRep']['DV']['Location'].get('country',''))
print('Country =',Country)
Continent = (FCData_Dic['SiteRep']['DV']['Location'].get('continent',''))
print('Continent =',Continent)
Elevation = (FCData_Dic['SiteRep']['DV']['Location'].get('elevation',''))
print('Elevation =',Elevation)
#There are also [] in the JSON data, which are referenced with integers,
# starting from [0]
#Here, the [0] refers to the first day's block of data defined with [].
DateDay0 = (FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['value'])
print('DateDay0 =',DateDay0)
#The second [0] picks out each of the first day's forecast data, in this case the time, referenced by '$'
TimeOfFC = (FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0]['$'])
print('TimeOfFC =',TimeOfFC)
#Ditto for the temperature.
Temperature = decimal.Decimal((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('T','')))
print('Temperature =',Temperature)
#Ditto for the screen relative humidity.
ScreenRelativeHumidity = decimal.Decimal((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('H','')))
print('ScreenRelativeHumidity =',ScreenRelativeHumidity)
#Ditto for the weather Type (a code number).
WeatherType = decimal.Decimal((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('W','')))
print('WeatherType =',WeatherType)
#Ditto for the wind gust.
WindGust = ((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('G','')))
print('WindGust =',WindGust)
#Ditto for the pressure.
Pressure = decimal.Decimal((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('P','')))
print('Pressure =',Pressure)
#Ditto for the visibility.
Visibility = decimal.Decimal((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('V','')))
print('Visibility =',Visibility)
#Ditto for the wind direction.
WindDirection = ((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('D','')))
print('WindDirection =',WindDirection)
#Ditto for the wind speed.
WindSpeed = decimal.Decimal((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('S','')))
print('WindSpeed =',WindSpeed)
#Ditto for the pressure tendency.
PressureTendency = ((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('Pt','')))
print('PressureTendency =',PressureTendency)
#Ditto for the dew point.
DewPoint = decimal.Decimal((FCData_Dic['SiteRep']['DV']['Location']['Period'][0]['Rep'][0].get('Dp','')))
print('DewPoint =',DewPoint)
# write the csv
OUTPUT_FILE = "C:\Temp\example_data.csv"
# Open the otput file for writing in binary mode.
with open(OUTPUT_FILE, 'w', newline='') as outcsv:
# Wrap the file object by the writer.
writer = csv.writer(outcsv)
# Write the header line to the output if needed.
writer.writerow(["dataDate"
,"LocationID"
,"Lat","Lon"
,"Name","Country"
,"Continent"
,"Elevation"
,"DateDay0"
,"TimeOfFC"
,"Temperature"
,"ScreenRelatveHumidity"
,"WeatherType"
,"WindGust"
,"Pressure"
,"Visibility"
,"WindDirection"
,"WindSpeed"
,"PressureTendency"
,"DewPoint"])
# Loop through the dictionary and get the tuples.
# Need to sort it somehow. Not shown here.
for t in LocationID:
writer.writerow([LocationID])
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Open in new window