TypeError:序列项1:预期的str实例,找到的字节

时间:2016-06-28 22:26:52

标签: python twitter

我想从twitter下载tweet作为使用Python Twitter API进行情绪分析的数据集。

我正在使用SemEval 2016任务6数据集。所以我下载了“Domain corpus for task B”,我发现了一个描述步骤的自述文件..

我只是一个初学者,我在python中不太了解..我安装了python 3.4.3,我已经在脚本文件夹中找到了easy_install.exe和pip.exe ..

我输入了cmd:“easy_install twitter”,因为它是用自述文件写的...然后我尝试应用自述文件中的步骤,以下是步骤:

  

第一次运行时,它应该打开一个Web浏览器,让您登录

     

Twitter,并显示一个PIN码,供您输入

生成的提示      

脚本。

     
      
  1. 使用您的默认浏览器中的用户名登录Twitter。

  2.   
  3. 运行此类脚本下载您的凭据:python download_tweets_api.py --dist=Donald_Trump.txt -- output=downloaded_Donald_Trump.txt

  4.   
  5. 下载这样的推文:python download_tweets_api.py --dist=Donald_Trump.txt --output=downloaded_Donald_Trump.txt

  6.   

我完成了第1步,然后输入了cmd“download_tweets_api.py --dist = Donald_Trump.txt --output = downloaded_Donald_Trump.txt”,但我在文件的最后一行收到错误

TypeError:序列项1:预期的str实例,找到的字节

以下是“download_tweets_api.py”文件的内容

import sys
import os
import time
import datetime
import argparse
from twitter import *

parser = argparse.ArgumentParser(description="downloads tweets")
parser.add_argument('--partial', dest='partial', default=None, type=argparse.FileType('r'))
parser.add_argument('--dist', dest='dist', default=None, type=argparse.FileType('r'), required=True)
parser.add_argument('--output', dest='output', default=None,type=argparse.FileType('w'), required=True)
args = parser.parse_args()


CONSUMER_KEY='xxxxxxxxxxx'
CONSUMER_SECRET='xxxxxxxxxxxxxxxxx'

MY_TWITTER_CREDS = os.path.expanduser('~/.my_app_credentials')
if not os.path.exists(MY_TWITTER_CREDS):
oauth_dance("Semeval sentiment analysis", CONSUMER_KEY, CONSUMER_SECRET, MY_TWITTER_CREDS)
oauth_token, oauth_secret = read_token_file(MY_TWITTER_CREDS)
t = Twitter(auth=OAuth(oauth_token, oauth_secret, CONSUMER_KEY, CONSUMER_SECRET))

cache = {}
if args.partial != None:
    for line in args.partial:
        fields = line.strip().split("\t")
        text = fields[-1]
        sid = fields[0]
        cache[sid] = text

for line in args.dist:
    fields = line.strip().split('\t')
    sid = fields[0]

    while not sid in cache:
        try:
            text = t.statuses.show(_id=sid)['text'].replace('\n', '  ').replace('\r', ' ')
            cache[sid] = text.encode('utf-8')
        except TwitterError as e:
            if e.e.code == 429:
                rate = t.application.rate_limit_status()
                reset = rate['resources']['statuses']['/statuses/show/:id'] ['reset']
                now = datetime.datetime.today()
                future = datetime.datetime.fromtimestamp(reset)
                seconds = (future-now).seconds+1
                if seconds < 10000:
                    sys.stderr.write("Rate limit exceeded, sleeping for %s  seconds until %s\n" % (seconds, future))
                    time.sleep(seconds)
            else:
                cache[sid] = 'Not Available'

    text = cache[sid]

    args.output.write("\t".join(fields + [text]) + '\n')

请注意,您可以在“domain corpus for task B”中找到download_tweets_api.py和自述文件

1 个答案:

答案 0 :(得分:0)

问题出在download_tweets_api.py脚本的最后一行。该脚本是用Python 2编写的,可能会在Python 2中无缝运行。它在Python 3中运行的主要原因是最后一行是尝试join字符串的字符串。但是,在Python 3中,bytes 明显strings不同,因为您不能将字节连接到字符串而不将其强制转换为另一个字符串。对于此脚本,text变量或fields变量(或两者)都是字节元素。因此,在对其应用字符串text函数之前,您可能必须修改变量fieldsjoin

基本上,您必须使用以下内容替换脚本的最后一行:

#Create a function that converts the byte elements of the list fields into strings.
def convert(s):
  try:
    return str(s,encoding='utf8')
  except:
    return s
text = convert(text)
fields = list(map(lambda x: convert(x), fields))
args.output.write("\t".join(fields + [text]) + '\n')

如果您不想修改脚本,则可能必须在Python 2中运行它,或使用2to3模块将代码转换为Python 3。

希望这有帮助。