【问题标题】:TypeError: sequence item 1:expected str instance, bytes found类型错误:序列项 1:预期的 str 实例,找到的字节
【发布时间】:2016-10-31 10:26:47
【问题描述】:

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

我正在使用 SemEval 2016 任务 6 数据集..所以我下载了“Domain corpus for task B”并找到了描述步骤的自述文件..

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

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

第一次运行时,它应该打开一个网络浏览器,你登录了吗

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

生成的提示

脚本。

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

  2. 像这样运行脚本以下载您的凭据:python download_tweets_api.py --dist=Donald_Trump.txt -- output=downloaded_Donald_Trump.txt

  3. 像这样下载推文:python download_tweets_api.py --dist=Donald_Trump.txt --output=downloaded_Donald_Trump.txt

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

TypeError: sequence item 1:expected str instance, bytes found

这里是“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 和自述文件

【问题讨论】:

标签: python twitter


【解决方案1】:

问题在于download_tweets_api.py 脚本的最后一行。该脚本是用 Python 2 编写的,并且可能会在 Python 2 中无缝运行。它没有在 Python 3 中运行的主要原因是最后一行试图用字节处理 join 字符串。然而,在 Python 3 中,bytes 显然 与 strings 不同,因为你不能将一个字节连接到一个字符串而不将一个字节强制转换为另一个字节。在此脚本的情况下,text 变量或fields 变量(或什至两者)都是字节元素。因此,您可能需要先修改变量text 和fields,然后再对它们应用字符串join 函数。

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

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

希望这会有所帮助。

【讨论】:

  • 我在 "text=str(text,encoding='utf8')" typeError: 不支持解码 str 行中遇到错误
  • @Sarsoura text 不是一个字节,所以你不需要解码它。我从答案中删除了该行。
  • No..我在字段行中遇到了同样的错误,这是来自 cmd mediafire.com/view/m90makl1lyq8zcn/1err.JPG的错误
  • @Sarsoura 我刚刚修改了答案。 fields 列表的某些元素似乎不是字节;所以这导致了错误。该函数应该负责从字节到字符串的转换。
  • 非常感谢..我尝试了修改后的代码,但它在连接函数中也给了我这个错误:TypeError:sequence item 1:expected str instance , bytes found here is full error mediafire.com/view/m90makl1lyq8zcn/1err.JPG
猜你喜欢
  • 2017-02-02
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多