2016-09-12 9 views
0

(Изменить: мой оригинальный вопрос отправлен здесь, но проблема была решена, а приведенный ниже код верен). Я ищу совет о том, как конвертировать символы Юникода в турецкие символы. Следующий код (размещенный в Интернете) сбрасывает твиты для отдельного пользователя и выводит файл csv, но турецкие символы выходят как символы Unicode, т. Е. \ Xc4. Я использую Python 3 на Mac.Юникод символов для турецких символов

import sys 

default_encoding = 'utf-8' 
if sys.getdefaultencoding() != default_encoding: 
    reload(sys) 
    sys.setdefaultencoding(default_encoding) 

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

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

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) 

#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 

превратить tweepy твитов в 2D массив, который населяют CSV

outtweets = [[tweet.id_str, tweet.created_at, tweet.text)] for tweet in alltweets] 

написать CSV-

with open('%s_tweets.csv', 'w', newline='', encoding='utf-8-sig') as f: 
    writer = csv.writer(f) 
    writer.writerow(["id","created_at","text"]) 
    writer.writerows(outtweets) 

pass 

if __name__ == '__main__': 

проход в имя пользователя учетной записи вы хотите скачать

get_all_tweets("") 
+0

Что произойдет, если вы * не * кодируете 'твит.текст'? –

+0

@MarkRansom, если я введу только «tweet.text» вместо «tweet.text.encode (« utf-8 »), я получаю следующую ошибку:« UnicodeEncodeError: кодек ascii не может кодировать символ «\ xd6» в позиция 55: порядковый номер не в диапазоне (128) " – bayrah

+0

' setdefaultencoding() '[не рекомендуется] (https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code /). –

ответ

4

csv module docs Рекомендуем вам указать кодировку при открытии файла. (а также вы используете newline='', чтобы CSV-модуль мог выполнять свою обработку для новых строк). Не кодируйте строки Unicode при записи строк.

import csv 

with open('test.csv', 'w', newline='', encoding='utf-8') as f: 
    writer = csv.writer(f) 
    writer.writerow(['id','created_at','text']) 
    writer.writerows([[123, 456, 'Äβç']]) 
+0

Получил, спасибо. Теперь, когда я открываю файл, я должен импортировать его как файл utf-8, когда я его открываю в Excel. Я предполагаю, что я выясню, как это сделать по умолчанию, поэтому мне не нужно делать это каждый раз. Кроме того, когда я импортирую данные следующим образом, по какой-то причине столбцы, которые я установил в Python, больше не сохраняются (т.е. id, created_at и текст - все один столбец). Это измененный код: – bayrah

+0

Я отредактировал код выше. Если у кого-нибудь есть какие-либо дополнительные советы, пожалуйста, дайте мне знать (об установке среды импорта и с колонками). Я не могу использовать запятую в качестве разделителя, потому что в них есть запятые. – bayrah

+0

@bayrah затем взгляните на остальные документы. Параметры импорта CSV (разделители и т. Д.) Должны соответствовать тому, как ваш скрипт записывает CSV-файл. – roeland