来自bit.ly的1.usa.gov数据
原文件是JOSN格式(JavaScript Object Notation,这是一种常用的Web数据格式),读取文件的一行:
关于readline()等:http://blog.csdn.net/werm520/article/details/6898473
#注意:这是在shell下直接写的,路径不在“平时练习”!
>>> open('usagov_bitly_data.txt').readline()
'{ "a": "Mozilla\\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\\/535.11 (KHTML, like Gecko) Chrome\\/17.0.963.78 Safari\\/535.11", "c": "US", "nk": 1, "tz": "America\\/New_York", "gr": "MA", "g": "A6qOVH", "h": "wfLQtf", "l": "orofrog", "al": "en-US,en;q=0.8", "hh": "1.usa.gov", "r": "http:\\/\\/www.facebook.com\\/l\\/7AQEFzjSi\\/1.usa.gov\\/wfLQtf", "u": "http:\\/\\/www.ncbi.nlm.nih.gov\\/pubmed\\/22415991", "t": 1331923247, "hc": 1331822918, "cy": "Danvers", "ll": [ 42.576698, -70.954903 ] }\n'
使用json模块及其loads函数将JSON字符串→Python字典对象:
使用Python解析JSON数据的基本方法:http://www.jb51.net/article/73450.htm
json.loads 几种错误 解决方案(以后可能用到):http://blog.csdn.net/altenli/article/details/42641083
#列表推导式 #处理后的records对象就成为一组Python字典了,索引从[0]开始,可访问 #可以字符串形式给出想访问的键
>>> import json
>>> records=[json.loads(line)for line in open('usagov_bitly_data.txt')]
>>> records[0]
{'al': 'en-US,en;q=0.8', 'g': 'A6qOVH', 'gr': 'MA', 'u': 'http://www.ncbi.nlm.nih.gov/pubmed/22415991', 't': 1331923247, 'cy': 'Danvers', 'a': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.78 Safari/535.11', 'r': 'http://www.facebook.com/l/7AQEFzjSi/1.usa.gov/wfLQtf', 'l': 'orofrog', 'll': [42.576698, -70.954903], 'hh': '1.usa.gov', 'nk': 1, 'c': 'US', 'tz': 'America/New_York', 'h': 'wfLQtf', 'hc': 1331822918}
>>> records[0]['tz']
'America/New_York'
>>> print(records[0]['tz'])
America/New_York
用纯Python代码对时区进行计数
欲知数据集最长出现的是哪个时区(time zone):
先用列表推导式取出一组时区 #注:因不是所有记录都有时区字段,故在式中加了判断条件“if 'tz'in rec”
>>> time_zones=[rec['tz']for rec in records if 'tz'in rec]
>>> time_zones[:10]#只看前十个时区
['America/New_York', 'America/Denver', 'America/New_York', 'America/Sao_Paulo', 'America/New_York', 'America/New_York', 'Europe/Warsaw', '', '', '']
对时区进行计数(法一:只使用标准Python库)
#遍历时区的过程中将计数值保存在字典中
def get_counts(sequence):
counts={}
for x in sequence:
if x in counts:
counts[x]+=1
else:
counts[x]=1 #单词第一次统计时在counts中相应的键存下默认值1
return counts
#使用defaultdict方法
from collections import defaultdict
def get_counts2(sequence):
counts=defaultdict(int)
#用dict.setdefault()方法设置默认值,defaultdict类的初始化函数接受一个类型作为参数,
#当所访问的键不存在时,可实例化一个值作为默认值——这所有值均被初始化为0
for x in sequence:
counts[x]+=1
return counts
写到函数里获得更高的可重用性,要对时区进行处理,只需传入time_zones即可:
>>> counts=get_counts(time_zones)
>>> counts['America/New_York'] #别写错单词!——得1251
>>> len(time_zones)——得3440
要想得到前10位的时区及其计数值,需用到字典的相关技巧:
#普通用字典的方法:
def top_counts(count_dict,n=10): #别忘这冒号!!!
value_key_pairs=[(count,tz) for tz,count in count_dict.items()]
value_key_pairs.sort()
return value_key_pairs[-n:]
>>>top_counts(counts)
#用collections.Counter类,使其变得简单
from collections import Counter
counts=Counter(time_zones)
counts.most_common(10)
>>>counts.most_common(10)