マイムの部屋

社内SEが,興味をもったことを書いていきます.

pythonで,ファイル作成しよとしたら文字コードによってエラーが起きた!!!

今日は,二回目の投稿です.TweepyでREST APIを使って,検索した結果をファイルに保存しようとしたら以下のようなエラーが出ました!!!!
UnicodeEncodeError: 'ascii' codec can't encode characters in position **: ordinal not in range(128)
なんとなく文字コード関連な気がする...と悟りました.
ちなみに,このエラーを吐いたソースコードは以下の通りになります.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tweepy
from tweepy import OAuthHandler
from datetime import timedelta

consumer_key="自分のcunsumer_key"
consumer_secret="自分のconsumer_secret"
access_token="自分のaccess_token"
access_token_secret="自分のaccess_token_secret"



if __name__ == '__main__':
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    f = open("/Users/***/Documents/Library/PythonLibrary/retweet.txt","w")

    useruser = api.user_timeline(id=あるユーザのID,count=100)
    
    print ("開始")

    for rt in useruser:
        retweeter = api.retweets(id=rt.id_str)
        for rter in retweeter:
            tweet = rter.text
            screen_name = str(rter.user.screen_name)
            createdat = str(rter.created_at + timedelta(hours=9))
            print ("tweet:" + tweet)
            print ("screen_name:" + screen_name)
            print ("createdat:" + createdat)
            
            f.write("tweet:" + tweet + "\nscreen_name:" + screen_name + "\ncreatedat:" + createdat)
    f.close
    print ("終了")

調べてみた結果,unicode型とstring型が違うからencodeしないと使えないのではないかということらしいです.知らんかった...
なので,encodeしてみたソースコードが以下のようになります.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tweepy
from tweepy import OAuthHandler
from datetime import timedelta

consumer_key="自分のcunsumer_key"
consumer_secret="自分のconsumer_secret"
access_token="自分のaccess_token"
access_token_secret="自分のaccess_token_secret"



if __name__ == '__main__':
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    f = open("/Users/***/Documents/Library/PythonLibrary/retweet.txt","w")

    useruser = api.user_timeline(id=621470828,count=100)
    
    print ("開始")

    for rt in useruser:
        retweeter = api.retweets(id=rt.id_str)
        for rter in retweeter:
            tweet = rter.text.encode('utf_8')
            screen_name = str(rter.user.screen_name).encode('utf_8')
            createdat = str(rter.created_at + timedelta(hours=9)).encode('utf_8')
            print ("tweet:" + tweet)
            print ("screen_name:" + screen_name)
            print ("createdat:" + createdat)
            
            f.write("tweet:" + tweet + "\nscreen_name:" + screen_name + "\ncreatedat:" + createdat)
    f.close
    print ("終了")

なんとか,ファイルを作成して書き込むことができたようです.ありごとうございます.

参考サイト