我有一个脚本可以流式传输由一个关键字过滤的Twitter数据。它将数据流式传输到csv文件中,但推文上附有大量对象,例如Id,created_at,text,source等。
我只需要将这些对象中的一些附加到csv文件,但即使在分割数据并仅附加文本对象之后,也会出现一些推文,其中附加了所有推文对象。似乎推文的推文分裂很好,普通的推文却不会分裂。
这是我的代码:
ckey = 'xxxxxxxxxxxxxx'
csecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
atoken = 'xxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
asecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
api = tweepy.API(auth)
def dateRange(start, end):
current = start
while(end - current).days >=0:
yield current
current = current + datetime.timedelta(seconds = 1)
class Tweetlistener(StreamListener):
def on_data(self, data):
startdate = datetime.datetime(2016,6,1)
enddate = datetime.datetime(2016,6,7)
for date in dateRange(startdate, enddate):
try:
##This is where I split the data
tweet = data.split(',"text":"')[1].split('","source')[0]
saveThis = str(time.time())+'::'+tweet
saveFile = open('test.csv', 'a')
saveFile.write(saveThis)
saveFile.write('\n')
return True
except ValueError:
print("Something went wrong with streaming")
saveFile.close()
def on_error(self, status):
print(status)
twitterStream = Stream(auth, Tweetlistener(), secure = True)
twitterStream.filter(track=['brexit'])
第一个单元格是转发,它按照我的意图分割,下面的单元格不是转发,它会附加所有推文对象。
我如何能够分割数据并仅附加文本,created_at,retweet_count,location,coqu ordinates?
编辑:
这是每条推文放入一行的原始数据(不是我的数据,只是我在网上找到的一个例子):
{
'contributors': None,
'truncated': False,
'text': 'My Top Followers in 2010: @tkang1 @serin23 @uhrunland @aliassculptor @kor0307 @yunki62. Find yours @ http://mytopfollowersin2010.com',
'in_reply_to_status_id': None,
'id': 21041793667694593,
'_api': ,
'author': ,
'retweeted': False,
'coordinates': None,
'source': 'My Top Followers in 2010',
'in_reply_to_screen_name': None,
'id_str': '21041793667694593',
'retweet_count': 0,
'in_reply_to_user_id': None,
'favorited': False,
'retweeted_status': ,
'source_url': 'http://mytopfollowersin2010.com',
'user': ,
'geo': None,
'in_reply_to_user_id_str': None,
'created_at': datetime.datetime(2011, 1, 1, 3, 15, 29),
'in_reply_to_status_id_str': None,
'place': None
}
我希望我的数据在这种格式中每行一条推文:
"created_at":Wed Aug 27 13:08:45 +0000 2008::"text"::Example tweet::"retweet_count":154::"favorite_count":200::"coordinates":[-75.14310264,40.05701649]
其中'::'区分对象。
答案 0 :(得分:2)
您可以使用json decoder执行此任务
import json
required_fields = [u'text', u'created_at', u'retweet_count', u'place', u'coordinates']
......
data = data.decode('utf-8')
json_data = json.loads(data) # this is dict
tweet = '::'.join([i+':'+unicode(json_data[i]) for i in required_fields])
答案 1 :(得分:1)
我认为你正在获取JSON数据,所以很自然地,在Excel中将这样的文件视为CSV是一个坏主意。
这一行
tweet = data.split(',"text":"')[1].split('","source')[0]
您需要改为解析密钥。例如
import json, csv
def on_data(self, data):
tweet = json.loads(data)
text = tweet["text"]
source = tweet["source"]
with open('test.csv', 'a') as f:
writer = csv.writer(f)
writer.writerow([text, source])
这个想法不是根据某些字符串将字符串分开,而是实际使用现有结构,然后按名称提取必要字段
Sidenote,我个人发现为每条消息打开和关闭文件的操作都很昂贵,所以我建议找到一种方法,只在流启动和停止时才这样做