2017-04-04 9 views
1

私はTwitter Streaming APIへのオープンな接続を維持するpythonスクリプトを持っており、そのデータをjsonファイルに書き込みます。書き込み中のファイルが一定のサイズに達した後、接続を中断することなく新しいファイルに書き込むことは可能ですか?たとえば、データを1週間以上ストリーミングしただけですが、すべてのデータが1つのファイル(〜2GB)に含まれているため、解析が遅くなります。例えば500MBと言うと新しいファイルに書き込めるのであれば、1つの大きなファイルの代わりに4つの小さいファイル(例えばdump1.json、dump2.jsonなど)を解析することになります。Python APIストリーミング、特定のサイズの後に新しいファイルを書き込む

import tweepy 
from tweepy import OAuthHandler 
from tweepy import Stream 
from tweepy.streaming import StreamListener 

# Add consumer/access tokens for Twitter API 
consumer_key = '-----' 
consumer_secret = '-----' 
access_token = '-----' 
access_secret = '-----' 

auth = OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_secret) 

api = tweepy.API(auth) 

# Define streamlistener class to open a connection to Twitter and begin consuming data 
class MyListener(StreamListener): 
def on_data(self, data): 
    try: 
     with open('G:\xxxx\Raw_tweets.json', 'a') as f: 
      f.write(data) 
      return True 
    except BaseException as e: 
     print("Error on_data: %s" % str(e)) 
     return True 
def on_error(self, status): 
    print(status) 
    return True 

bounding_box = [-77.2157,38.2036,-76.5215,39.3365]#filtering by location 
keyword_list = ['']#filtering by keyword 

twitter_stream = Stream(auth, MyListener()) 
twitter_stream.filter(locations=bounding_box) # Filter Tweets in stream by location bounding box 
#twitter_stream.filter(track=keyword_list) # Filter Tweets in stream by keyword 

答えて

0

あなたは、それはむしろ単純開き、再度、ファイルごとにあるので - ファイル名と事前にインデックスを使用し、それはあなたのファイルサイズがしきい値に達した場合

class MyListener(StreamListener): 
    def __init(self): 
     self._file_index = 0 

    def on_data(self, data): 
     tweets_file = 'G:\xxxx\Raw_tweets{}.json'.format(self._file_index) 
     while os.path.exists(tweets_file) and os.stat(tweet_file).st_size > 2**10: 
      self._file_index += 1 
      tweets_file = 'G:\xxxx\Raw_tweets{}.json'.format(self._file_index) 
.... 
サイクルの世話をします

あなたのアプリは再起動されます

+0

ファイルサイズをどのように設定するのですか?os.stat(tweet_file).st_size> 2 ** 10'ですか? –

+0

@AndrewR。これはファイルサイズを確認する方法です。例外を避けるためにまず存在をチェックします - あなたは_try ... except_を使うかもしれません。このコードを_getter_メソッドにパッケージ化することができます。 – volcano

関連する問題