通过使用Python从字典中的字典中读取推文来填充SQL表

时间:2013-11-16 17:19:23

标签: python twitter dictionary sqlite

我正在尝试从文件中读取1000条推文。

http://rasinsrv07.cstcis.cti.depaul.edu/CSC455/Twitter_2013_11_12.txt

推文是逐行存储的。 我必须为'geo'条目创建一个SQL表。 'Geo'是推特词典中的字典。在某些情况下,词典'geo'是完全空白的,并且在它的情况下它具有值。我需要跟踪有多少地理词典是空白的,有多少有词。我需要为该表生成一个唯一的ID。除了ID列之外,geo表还应具有“type”,“longitude”和“latitude”列。如果Geo字典有值,它看起来像这样:

{u'type': u'Point', u'coordinates': [44.49241705, 11.33374359]}

由于我是Python和SQLITE的新手,我的代码是基本的(因为我希望能够理解我的代码),并且它没有按预期工作。如果地理字典的长度大于1,我试图在Geo表中插入,但它不起作用。任何意见都将不胜感激。

import urllib2, time, json, sqlite3
conn = sqlite3.connect('Tweets_Database_A6.db')
c = conn.cursor()
wFD = urllib2.urlopen('http://rasinsrv07.cstcis.cti.depaul.edu/CSC455/Twitter_2013_11_12.txt')

numLines = 1000
tweets = []
while numLines > 0:
    line = wFD.readline()
    numLines = numLines - 1
    try:    
         tweets.append(json.loads(line))
    except:
        print line
wFD.close()   

#create geo table using sqlite3
TblGeo = """create table Geo(Id number, Type text, Longitude number, latitude number);"""
c.execute(TblGeo) 

HasGeo=0
NoGeo=0
for tweet in tweets:
    tweet_geo = tweet['geo']
    if len(tweet_geo) > 1:
        HasGeo = HasGeo+1
    try:            
        c.execute("insert into Geo(id, Type, Longitude, Latitude) values ('%s', '%s', '%s', '%s')" %(HasGeo, tweet_geo['type'], tweet_geo['coordinates'][0], tweet_geo['coordinates'][1]))               
    except:
        print "no entry for " , i
    else:
        NoGeo = NoGeo+1

print HasGeo, " ", NoGeo

1 个答案:

答案 0 :(得分:1)

您的代码失败有几个原因。由于这似乎是一项任务,我不会在此发布工作代码,但我会尝试指出正确的方向。以下是我在测试代码时注意到的一些事项:

  1. 你假设tweet ['geo']是一个空字符串。实际上并非如此。基本上,当没有可用的地理信息时,数据将此值设置为json“null”;这被转换为python中的Nonetype,而不是空字符串。因此,您不应该检查该值的长度,而是检查该值是否为True(提示:python认为'',“”,[] ,, {},None为False)
  2. 我不认为你在第28-31行的缩进是正确的。不应该在if块中执行该逻辑吗?现在,您总是执行该代码,我认为这是一个逻辑错误。
  3. 在第31行的异常捕获中,您在哪里定义变量“i”?
  4. 我希望这很有帮助;如果你感到难过,可以随意提出额外的澄清。