2016-08-13 2 views
0

Я использую Tweepy в первый раз. В настоящее время получение этой ошибкиIOError: [Errno 2] Нет такого файла или каталога: значит, файл не был записан?

--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 
<ipython-input-11-cdd7ebe0c00f> in <module>() 
----> 1 data_json = io.open('raw_tweets.json', mode='r', encoding='utf-8').read() #reads in the JSON file 
     2 data_python = json.loads(data_json) 
     3 
     4 csv_out = io.open('tweets_out_utf8.csv', mode='w', encoding='utf-8') #opens csv file 

IOError: [Errno 2] No such file or directory: 'raw_tweets.json' 

У меня такое ощущение, что код, который у меня есть, не работает. Например, print (status) ничего не печатает. Также я не вижу сохраненного файла CSV или JSON в каталоге.

Я новичок, поэтому любая помощь/документация, которую вы можете предложить, будет отличной!

import time 
from tweepy import Stream 
from tweepy import OAuthHandler 
from tweepy.streaming import StreamListener 
import os 
import json 
import csv 
import io 
from pymongo import MongoClient 

ckey = 'blah' 
consumer_secret = 'blah' 
access_token_key = 'blah' 
access_token_secret = 'blah' 


#start_time = time.time() #grabs the system time 
keyword_list = ['keyword'] #track list 

#Listener Class Override 
class listener(StreamListener): 

    def __init__(self, start_time, time_limit=60): 

     self.time = start_time 
     self.limit = time_limit 
     self.tweet_data = [] 

    def on_data(self, data): 

     saveFile = io.open('raw_tweets.json', 'a', encoding='utf-8') 

     while (time.time() - self.time) < self.limit: 

      try: 

       self.tweet_data.append(data) 

       return True 


      except BaseException, e: 
       print 'failed ondata,', str(e) 
       time.sleep(5) 
       pass 

     saveFile = io.open('raw_tweets.json', 'w', encoding='utf-8') 
     saveFile.write(u'[\n') 
     saveFile.write(','.join(self.tweet_data)) 
     saveFile.write(u'\n]') 
     saveFile.close() 
     exit() 

    def on_error(self, status): 

     print status 

class listener(StreamListener): 
    def __init__(self, start_time, time_limit=10): 

     self.time = start_time 
     self.limit = time_limit 

    def on_data(self, data): 

     while (time.time() - self.time) < self.limit: 
      print(data) 
      try: 


       client = MongoClient('blah', 27017) 
       db = client['blah'] 
       collection = db['blah'] 
       tweet = json.loads(data) 

       collection.insert(tweet) 

       return True 


      except BaseException as e: 
       print('failed ondata,') 
       print(str(e)) 
       time.sleep(5) 
       pass 

     exit() 

    def on_error(self, status): 
     print(status) 
data_json = io.open('raw_tweets.json', mode='r', encoding='utf-8').read() #reads in the JSON file 
data_python = json.loads(data_json) 

csv_out = io.open('tweets_out_utf8.csv', mode='w', encoding='utf-8') #opens csv file 

ОБНОВЛЕНО: Создает файл, но файл пуст

import tweepy 
import datetime 
auth = tweepy.OAuthHandler('xxx', 'xxx') 
auth.set_access_token('xxx', 'xxx') 


class listener(tweepy.StreamListener): 

    def __init__(self, timeout, file_name, *args, **kwargs): 

     super(listener, self).__init__(*args, **kwargs) 
     self.start_time = None 
     self.timeout = timeout 
     self.file_name = file_name 
     self.tweet_data = [] 

    def on_data(self, data): 
     if self.start_time is None: 
      self.start_time = datetime.datetime.now() 
     while (datetime.datetime.now() - self.start_time).seconds < self.timeout: 
      with open(self.file_name, 'a') as data_file: 
       data_file.write('\n') 
       data_file.write(data) 

    def on_error(self, status): 
     print status 


l = listener(60, 'stack_raw_tweets.json') 
mstream = tweepy.Stream(auth=auth, listener=l) 
mstream.filter(track=['python'], async=True) 
+0

1. Можете ли вы попробовать полный путь к «raw_tweets.json», а также писать, почему у вас есть два класса с одинаковым именем. – Akilesh

+1

Ваши классы ничего не делают, если они не созданы и не зарегистрированы в качестве обработчика. – Akilesh

+0

@Akilesh Пробовал полный путь без успеха :(Не могли бы вы предложить, где/как я поместил обработчик? –

ответ

1

Вы не создаете поток для слушателя. Последняя, ​​но одна строка кода ниже делает это. Вслед за этим вам нужно запустить Stream, который является последней строкой. Я должен предупредить вас, что хранить это в mongodb - это правильная вещь, поскольку файл, который я храню, кажется, легко растет до нескольких ГБ. Также файл не является точно json. Каждая строка в файле - json. Вы должны настроить его на свои нужды.

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


class listener(tweepy.StreamListener): 

    def __init__(self, timeout, file_name, *args, **kwargs): 

     super(listener, self).__init__(*args, **kwargs) 
     self.start_time = None 
     self.timeout = timeout 
     self.file_name = file_name 
     self.tweet_data = [] 

    def on_data(self, data): 
     if self.start_time is None: 
      self.start_time = datetime.datetime.now() 
     while (datetime.datetime.now() - self.start_time).seconds < self.timeout: 
      with open(self.file_name, 'a') as data_file: 
       data_file.write('\n') 
       data_file.write(data) 

    def on_error(self, status): 
     print status 


l = listener(60, 'raw_tweets.json') 
mstream = tweepy.Stream(auth=auth, listener=l) 
mstream.filter(track=['python'], async=True) 
+0

На положительной ноте он создал файл JSON. Однако он был пуст, и я получил следующее сообщение об ошибке. Исключение в потоке Thread-5: Traceback (самый последний вызов последнего): Файл "C: \ Anaconda2 \ Lib \ threading.py", строка 801, в __bootstrap_inner self.run() Файл «C: \ Anaconda2 \ lib \ threading.py ", строка 754, в запуске self .__ target (* self .__ args, ** self .__ kwargs) Файл" C: \ Anaconda2 \ lib \ site-packages \ tweepy \ streaming.py " , строка 294, в _run raise exception ConnectionError: ('Connection aborted.', BadStatusLine ("'' ',)) –

+0

Вы используете точно такой же код, который я разместил? Можете ли вы отредактировать исходный пост и поместить свой новый код. Соединение прервано может означать, что вы потеряли интернет-соединение, когда tweepy передавал данные, но ваш json-файл должен был иметь некоторые данные. – Akilesh

+0

Я обновил сообщение. Я также проверил его пару раз, чтобы проверить, def не заполняется. –