Work programmatically with Google Spreadsheets Part 2
A while back I wrote a short post on how you can write and read to Google Spreadsheets programmatically using Python and the package ‘gspread’.
Last time the reading was done by first creating arrays with the addresses to where the values could be found in the spreadsheet, and then run through all the values and replace the addresses with the values. It worked fine, but it’s not best practice or very efficient as it makes many single requests on the API. In part two, I will share a short tip on how to read the values in one go instead of iterating through a range of values.
Here is the excerpt dealing with retrieving values. (NB: see original blogpost for gspread initialization).
[python]
#Running through the values
get_val = []
set_name = []
set_country = []
for a in range(2,5124):
v = "B%s" % a
sn = "H%s" % a
sc = "G%s" % a
get_val.append(v)
set_name.append(sn)
set_country.append(sc)
for a in range(2,5124):
try:
name = worksheet.acell(get_val[a]).value
res = getCountry(name)
if res:
print res
country, last_id, name = res
worksheet.update_acell(set_name[a], name)
worksheet.update_acell(set_country[a], country)
except Exception as e:
print e
[/python]
In a recent script we only wanted to download values from a Google spreadsheet (yes, we could have exported the files to .csv with similar result, but with a script we may expand and parse if needed), and this gave some time for refactoring the code as well.
The gspread function worksheet.get_all_values() returns a list of lists with the values. The outer list contains the rows, and the row list contains the specific value of the column at the numerical value for the column. In this example num_streams is the second column, and the position is hence [1] as the list starts at zero.
Also note the nifty way of writing utf-8 formatted strings to the file. UTF-8 can often cause an headache, but put a “u”-character before the string and open the stream with codecs.open(“filename”,”mode”,”encoding”).
The new way of retrieving data from a Google Docs Spreadsheet:
# -*- coding: UTF-8 -*- import gspread import codecs # Global variables for accessing resource G_USERNAME = 'user_email' G_PASSWORD = 'password' G_IDENTIFIER = 'spreadsheet_identifier' # Connecting to the data source gc = gspread.login(G_USERNAME,G_PASSWORD) sht1 = gc.open_by_key(G_IDENTIFIER) worksheet = sht1.get_worksheet(0) all_val = worksheet.get_all_values() output = codecs.open('output_norwegian_artists.csv','wb', "utf-8-sig") for l in all_val: num_streams, artistid, name = (l[1],l[2],l[3]) norwegian = l[4] if len(norwegian) < 3: norwegian = 'NULL' string = u"{0};{1};{2};{3}\n".format(num_streams, artistid, name, norwegian) output.write(string) output.close()
Picture licensed under a creative commons attribution license by the brilliant organization Open Knowledge Foundation. Picture retrieved through a CC-search on Flickr