8

I have a script which consumes an API of bus location, I am attempting to parse the lat/lng fields which are float objects. I am repeatedly receiving this error.

row.append(Decimal(items['longitude'].encode('utf-16'))) AttributeError: 'float' object has no attribute 'encode'

# IMPORTS
from decimal import *

#Make Python understand how to read things on the Internet
import urllib2

#Make Python understand the stuff in a page on the Internet is JSON
import simplejson as json
from decimal import Decimal

# Make Python understand csvs
import csv

# Make Python know how to take a break so we don't hammer API and exceed rate limit
from time import sleep

# tell computer where to put CSV
outfile_path='C:\Users\Geoffrey\Desktop\pycharm1.csv'

# open it up, the w means we will write to it
writer = csv.writer(open(outfile_path, 'wb'))

#create a list with headings for our columns
headers = ['latitude', 'longitude']

#write the row of headings to our CSV file
writer.writerow(headers)


# GET JSON AND PARSE IT INTO DICTIONARY

# We need a loop because we have to do this for every JSON file we grab

#set a counter telling us how many times we've gone through the loop, this is the first time, so we'll set it at 1
i=1

#loop through pages of JSON returned, 100 is an arbitrary number
while i<100:
    #print out what number loop we are on, which will make it easier to track down problems when they appear
    print i
    #create the URL of the JSON file we want. We search for 'egypt', want English tweets, 
#and set the number of tweets per JSON file to the max of 100, so we have to do as little looping as possible
    url = urllib2.Request('http://api.metro.net/agencies/lametro/vehicles' + str(i))
    #use the JSON library to turn this file into a Pythonic data structure
    parsed_json = json.load(urllib2.urlopen('http://api.metro.net/agencies/lametro/vehicles'))
    #now you have a giant dictionary.
#Type in parsed_json here to get a better look at this. 
#You'll see the bulk of the content is contained inside the value that goes with the key, or label "results". 
#Refer to results as an index. Just like list[1] refers to the second item in a list, 
#dict['results'] refers to values associated with the key 'results'.
    print parsed_json



    #run through each item in results, and jump to an item in that dictionary, ex: the text of the tweet
    for items in parsed_json['items']:

     #initialize the row
         row = []
     #add every 'cell' to the row list, identifying the item just like an index in a list
#if latitude is not None:
    #latitude = str(latitude)
#if longitude is not None:
    #longitude = str(longitude)
    row.append(Decimal(items['longitude'].encode('utf-16')))
    row.append(Decimal(items['latitude'].encode('utf-16')))
     #row.append(bool(services['predictable'].unicode('utf-8')))
     #once you have all the cells in there, write the row to your csv
    writer.writerow(row)
    #increment our loop counter, now we're on the next time through the loop
    i = i +1
    #tell Python to rest for 5 secs, so we don't exceed our rate limit
    sleep(5)

2 Answers 2

4

encode is available only for string. In your case item['longitude'] is a float. float doesn't have encode method. You can type case it and then use encode. You can write like,

str(items['longitude']).encode('utf-16')
str(items['latitude']).encode('utf-16')

I think you can't pass an encoded string to Decimal object.

Sign up to request clarification or add additional context in comments.

2 Comments

Runs, but doesn't write to CSV, no errors are noted either.
How it works? If you have encoded it will throw decimal.InvalidOperation with the message Invalid literal for string
1

encode is a method that strings have, not floats.

Change row.append(Decimal(items['longitude'].encode('utf-16'))) to row.append(Decimal(str(items['longitude']).encode('utf-16'))) and similar with the other line.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.