按位置过滤推文文件

时间:2015-04-06 19:41:48

标签: python json twitter dictionary key

我正在尝试查找众多推文的lat / long信息。 json推文中推文纬度/长数据的一条路径是,

{u'location:{u'geo':{u'coordinates:[120.0,-5.0]}}}

我希望能够检查每条推文是否存在此位置路径。如果是,那么我想稍后在函数中使用该信息。如果没有,那么我想检查另一个位置路径,最后转到下一条推文。

以下是我目前检查此路径是否存在以及是否存在相应数据的代码。 'data'是我使用 data.append(json.loads(line))方法打开的twitter文件列表。

counter = 0
for line in data:
    if u'coordinates' in data[counter][u'location'][u'geo']:

        print counter, "HAS FIELD"
        counter += 1
    else:
        counter += 1
        print counter, 'no location data'

我的代码出现KeyError错误。如果我只是执行以下代码它可以工作,但不够具体到实际上让我获得我需要的信息。

counter = 0
for line in data:
    if u'location' in data[counter]:

        print counter, "HAS FIELD"
        counter += 1
    else:
        counter += 1
        print counter, 'no location data'

有没有人有办法做到这一点。

以下是关于我整体行动的更多背景知识,但以上总结了我被困的地方。

背景:我可以访问通过gnip购买的120亿条推文,这些推文分为多个文件。我试图逐个梳理这些推文,找到哪些具有位置(纬度/经度)数据,然后查看相应的坐标是否落在某个国家/地区。如果该推文落入该国家,我会将其添加到新数据库中,该数据库是我较大数据库的子集。

我已经成功创建了一个函数来测试lat / long是否落在我的目标国家/地区的边界框中,但由于两个原因,我很难为每条推文填充lat / long。 1)如果存在长/拉数据,则每个json文件中存在多个地方。 2)这些推文是在一本复杂的字典词典中组织的,我很难操纵它。

我需要能够遍历每条推文,看看是否存在针对不同位置路径的特定纬度/长度组合,以便我可以将其拉入并将其提供给我的函数,该函数测试该推文是否源自我的国家/地区兴趣。

2 个答案:

答案 0 :(得分:0)

  

我的代码

出现KeyError错误

假设密钥应该是双引号,因为它们有'

counter = 0
for line in data:
    if "u'coordinates" in data[counter]["u'location"]["u'geo"]:

        print counter, "HAS FIELD"
        counter += 1
    else:
        counter += 1
        print counter, 'no location data'

答案 1 :(得分:0)

我找到的解决方案可能不是最有效的,但功能正常。它使用嵌套在 try-except 语句中的 if 语句。这允许我检查不同的位置路径,但推送 KeyError ,以便我可以转到其他推文和路径。以下是我的代码。它通过多个推文并检查3个路径中任何一个都有可用的Lat / Long组合的推文。它适用于我的 addTOdb 函数,该函数检查Lat / Long组合是否在我的目标国家/地区。它还构建了一个名为 Lat Long 的独立字典,在那里我可以查看所有具有Lat / Long组合的推文以及我将它们拉过的路径。



#use try/except function to see if entry is in json files
#initialize counter that numbers each json entry
counter = 0
#This is a test dict to see what lat long was selected
Lat_Long = {}
for line in data:
    TweetLat = 0
    TweetLong = 0
    #variable that will indicate what path was used for coordinate lat/long
    CoordSource = 0
    #Sets while variable to False.  Will change if coords are found.
    GotCoord = False
    while GotCoord == False:
        #check 1st path using geo function
        try:
            
            if u'coordinates' in data[counter][u'geo'] and GotCoord == False:
                TweetLat = data[counter][u'geo'][u'coordinates'][0]
                TweetLong = data[counter][u'geo'][u'coordinates'][1]
                #print 'TweetLat',TweetLat
                print counter, "HAS FIELD"
                addTOdb(TweetLat,TweetLong,North,South,East,West)
                CoordSource = 1
                GotCoord = True
        except KeyError:
            pass
        #check 2nd path using gnip info
        try:
            if u'coordinates' in data[counter][u'gnip'][u'profileLocations'][0][u'geo'] and GotCoord == False:
                TweetLat = data[counter][u'gnip'][u'profileLocations'][0][u'geo'][u'coordinates'][1]
                TweetLong = data[counter][u'gnip'][u'profileLocations'][0][u'geo'][u'coordinates'][0]
                print counter, "HAS FIELD"
                addTOdb(TweetLat,TweetLong,North,South,East,West)
                CoordSource = 2
                GotCoord = True
        except KeyError:
            pass
        #check 3rd path using location polygon info
        try:     
            if u'coordinates' in data[counter][u'location'][u'geo'] and GotCoord == False:
                TweetLat = data[counter][u'location'][u'geo'][u'coordinates'][0][0][1]
                TweetLong = data[counter][u'location'][u'geo'][u'coordinates'][0][0][0]
                print counter, "HAS FIELD"
                addTOdb(TweetLat,TweetLong,North,South,East,West)
                CoordSource = 3
                GotCoord = True
        except KeyError:
            pass
         
        if GotCoord==True:
            Lat_Long[counter] = [CoordSource,TweetLat, TweetLong]
        else:
            print counter, "no field"
            GotCoord = True       
    counter += 1