我正在尝试查找众多推文的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)这些推文是在一本复杂的字典词典中组织的,我很难操纵它。
我需要能够遍历每条推文,看看是否存在针对不同位置路径的特定纬度/长度组合,以便我可以将其拉入并将其提供给我的函数,该函数测试该推文是否源自我的国家/地区兴趣。
答案 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