2016-08-08 40 views
-1

Im Versuch, die Tweets alle aus den letzten 24 Stunden zu sammeln und sie in eine CSV setzen Dateialle Tweets aus der Vergangenheit 24 Stunden zu sammeln Versuch und sie in eine CSV setzen Datei

Wenn ich dies tun bekomme ich

_csv.Error: iterable expected, not datetime.datetime 

Als Fehler

Kann mir jemand helfen, zu sagen, wie dieser Fehler und anderer Verbesserungen, um loszuwerden, die möglicherweise an den Code vorgenommen werden könnten

def get_all_tweets(screen_name): 
# Twitter only allows access to a users most recent 3240 tweets with this method 

# authorize twitter, initialize tweepy 
auth = tweepy.OAuthHandler(consumer_token, consumer_secret) 
auth.set_access_token(access_token, access_secret) 
api = tweepy.API(auth, wait_on_rate_limit=True) 

# initialize a list to hold all the tweepy Tweets 
alltweets = []  

# make initial request for most recent tweets (20 is the maximum allowed count) 
new_tweets = api.home_timeline (screen_name=screen_name, count=20) 

# save most recent tweets 
alltweets.extend(new_tweets) 

# save the id of the oldest tweet less one 
oldest = alltweets[-1].id - 1 

page = 1 
deadend = False 



while len(new_tweets) > 0: 
     print ("getting tweets before %s" % (oldest)) 

     # all subsiquent requests use the max_id param to prevent duplicates 
     new_tweets = api.home_timeline(screen_name=screen_name, count=20, max_id=oldest, page = page) 

     # save most recent tweets 
     alltweets.extend(new_tweets) 

     # update the id of the oldest tweet less one 
     oldest = alltweets[-1].id - 1 

     print ("...%s tweets downloaded so far" % (len(alltweets))) 

     for tweet in alltweets: 

      if (datetime.datetime.now() - tweet.created_at).days < 1: 

       # transform the tweepy tweets into a 2D array that will populate the csv  
       outtweets = [tweet.id_str, tweet.created_at, tweet.text.encode("utf-8")] 

      else: 
       deadend = True 
       return 
     if not deadend: 
      page += 1 
      time.sleep(10) 

# write the csv  
with open('%s_tweetsBQ.csv' % screen_name, 'w') as f: 
    writer = csv.writer(f) 
    writer.writerow(["id", "created_at", "text"]) 
    writer.writerows(outtweets) 
pass 

print ("CSV written") 

if __name__ == '__main__': 
# pass in the username of the account you want to download 
get_all_tweets("BQ") 

bearbeiten

(most recent call last): 
File "C:\Users\Barry\workspace\TwitterTest\Test1\MGo.py", line 77, in <module> 
    get_all_tweets("BQ") 
File "C:\Users\Barry\workspace\TwitterTest\Test1\MGo.py", line 70, in get_all_tweets 
writer.writerows(outtweets) 
_csv.Error: iterable expected, not datetime.datetime 

EDIT 2

for row in outtweets: 
      date_str,time_str, entries_str = row.split() 
      #print(a_date,a_time, entries) 
      a_time = datetime.strptime(time_str, "%H:%M:%S") 
      for e in entries_str.split(','): 
       # write the csv  
       with open('%s_tweetsBQ.csv' % screen_name, 'w') as f: 
        writer = csv.writer(f) 
        writer.writerow(["id", "created_at", "text"]) 
        writer.writerows(outtweets) 
       pass 
+0

Bitte korrigieren Sie Ihren Einzug und veröffentlichen Sie den ** Volltext ** des Tracebacks. – MattDMo

+0

Einrückungen behoben, Gehen Sie zum Hinzufügen der Traceback zur Frage – Barry

+0

Verwenden Sie die [Bearbeiten] -Funktion, um zu tun, was ich fragte. Veröffentlichen Sie keinen Code oder Tracebacks in Kommentaren, sie können nicht gelesen werden. – MattDMo

Antwort

2

outtweets enthält immer nur eine einzige Reihe von Daten. writer.writerows() erwartet eine Liste von Zeilen, das heißt, eine Liste von Listen:

[ 
    [columns, in, row, 1], 
    [columns, in, row, 2], 
] 

Du outtweets wie diese Einstellung:

outtweets = [tweet.id_str, tweet.created_at, tweet.text.encode("utf-8")] 

Das ist nur eine einzige Reihe ist. Um dies an writerows zu übergeben, müssen Sie jede Datenzeile in einer Liste sammeln und diese Liste dann an writerows übergeben.

+0

Danke, ich bin komplett neu, können Sie mir sagen, wie ich die Zeilen in Listen setzen würde? – Barry

+0

Wenn Sie eine Liste haben, können Sie ihr etwas mit der Methode 'append' hinzufügen. Wie in 'mylist = []; mylist.append (irgendein_Wert) '. Oder sogar 'my_list.append (some_other_list)'. Hoffentlich weist dich das in die richtige Richtung. – larsks

+0

also sollte ich eine Instanz der Liste vor der Schleife erstellen und dann bei jeder Iteration der Schleife anhängen? – Barry