2017-02-11 21 views
2

Я использую Spyder на Mac, а версия Python на Spyder - 2,7. Несколько месяцев назад я использовал следующий код, чтобы очистить твиты, но теперь я обнаружил, что он больше не работает. Во-первых, я уже не мог использовать:ТипError: file() принимает не более 3 аргументов (4 данных)

from urllib.request import url open 

и теперь используют

from urllib2 import url open 

Однако, я не могу запустить код и получить следующее сообщение об ошибке: «с открытой ('% s_tweets.csv '% screen_name, 'W', новая строка ='», кодирование = 'UTF-8-сиг'), как F: Ошибка типа: файл() принимает не более 3 аргументов (4 заданных)»

import sys 
from urllib2 import urlopen 

default_encoding = 'utf-8' 

import tweepy #https://github.com/tweepy/tweepy 
import csv 

#Twitter API credentials 
consumer_key = "" 
consumer_secret = "" 
access_key = "" 
access_secret = "" 

screenNamesList = [] 

def redirect(url): 
page = urlopen(url) 
return page.geturl() 

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_key, consumer_secret) 
auth.set_access_token(access_key, 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 (200 is the maximum allowed count) 
new_tweets = api.user_timeline(screen_name = screen_name,count=200) 

#save most recent tweets 
alltweets.extend(new_tweets) 

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

#keep grabbing tweets until there are no tweets left to grab 
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.user_timeline(screen_name = screen_name,count=200,max_id=oldest) 

    #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)) 

#transform the tweepy tweets into a 2D array that will populate the csv 
outtweets = [[tweet.id_str, tweet.created_at, tweet.text, tweet.retweet_count, tweet.coordinates, tweet.favorite_count, tweet.author.followers_count, tweet.author.description, tweet.author.location, tweet.author.name] for tweet in alltweets] 

#write the csv 

with open('%s_tweets.csv' % screen_name, 'w', newline='', encoding='utf-8-sig') as f: 
    writer = csv.writer(f) 
    writer.writerow(["id", "created_at", "text", "retweet_count", "coordinates", "favorite_count", "followers_count", "description", "location", "name"]) 
    writer.writerows(outtweets) 

pass 


if __name__ == '__main__': 
#pass in the username of the account you want to download 
for i, user in enumerate(screenNamesList): 
    get_all_tweets(screenNamesList[i]) 
    i+=1 

ответ

5

Этого код предназначен для python 3, где open получает новые параметры:

  • кодирование
  • новой строки

В Python 2, есть только три параметра можно:

open(name[, mode[, buffering]])

buffering не то, что вы хотите. Других нигде не найти.

Вы можете обойти это с помощью

with open('%s_tweets.csv' % screen_name, 'wb') as f: 

открытия ручки в бинарном фиксирует «пустая строка» ошибка csv модуля. С python 3 (только «старые» версии, новая версия не нуждается в этом), вы должны пройти newline="", так как вы не можете открыть файл csv как двоичный.

Для обработки кодирования и перевода строки, вы можете просто сделать, как описано here:

from io import open 

и оставить остальную часть вашего кода без изменений. Ну, почти, вы должны префикс unicode для вашего титула:

writer.writerow([u"id", u"created_at", u"text", u"retweet_count", u"coordinates", u"favorite_count", u"followers_count", u"description", u"location", u"name"]) 
+0

Отлично, спасибо, это сработало. Однако, что я могу сделать с добавлением «encoding = 'utf-8-sig» где-то. Или, если я попытаюсь запустить Spyder в Python 3? – bayrah

+0

проверить мое редактирование. Я думаю, что вы можете справиться с этим с помощью python 2.7 с помощью модуля 'io'. –

+0

Спасибо. Это дает ошибку: write() аргумент 1 должен быть unicode, а не str после "writer.writerow ([" id "," created_at "," text "," retweet_count "," maps "," favorite_count "," followers_count " , «description», «location», «name»]) « – bayrah