a bytes-like object is required, not 'str'

TypeError: a bytes-like object is required, not 'str'

问题分析

该问题主要是由于当前操作的字符串是bytes类型的字符串对象,并对该bytes类型的字符串对象进行按照str类型的操作。
如下面图所示,s 为bytes类型字符串对象。

当对s进行按照str类型的操作(split)时,会弹出一下错误提示。因为split函数传入的参数是str类型的字符串,而党鞭的s为bytes编码类型的字符串对象

解决方法

此时的解决办法是,将s转码成为str类型的或者是将对s进行str类型操作转化为对bytes类型的操作。
方法1:bytes-->str
方法2:对s进行str类型操作转化为对bytes类型的操作
由于split里面用到分解字符串中的是空格‘  ’,但是该‘ ’是按照str编码的,需要转化成为bytes类型的,然后再直接对s进行对bytes类型的操作。

str和bytes类型之间的常用转码方式:

1、str to bytes:(3种方式)

2、bytes to str (3种方式)
阅读更多

TypeError: a bytes-like object is required, not 'str'

10-24

完全参照网络上他人的程序做情感分析,但这段程序也出现问题:.........line 101, in wordsrn degreeDict[d.split(' ')[0]] = d.split(' ')[1]rnTypeError: a bytes-like object is required, not 'str'rnpython3 编码什么那么麻烦啊?请问大家这个怎么解决?rn[code=python]rn#!/usr/bin/env python rn#-*- coding: utf-8 -*- rnfrom collections import defaultdictrnimport osrnimport rernimport jiebarnimport codecsrnimport sysrnimport chardetrnimport matplotlib.pyplot as pltrnimport importlib rnimportlib.reload(sys)rnrn#使用jieba 函数 对 sentence 文本进行分词rnrndef sent2word(sentence):rnrn#调用jieba进行分词rn segList = jieba.cut(sentence)rnrn#分词后的结果存为segResult 为list类型rn segResult = []rn for w in segList:rn segResult.append(w)rnrn#调用 readLines 读取停用词rn stopwords = readLines('E:/词库/stop_words.txt')rnrn#如果是停用词 就不保存到newSentrn newSent = []rn for word in segResult:rn if word+'\n' in stopwords:rn continuern else:rn newSent.append(word)rn#返回newSentrn return newSentrnrnrn#直接对 sentence 进行分词 不使用停用词 并返回(主要是根据word需要这个操作)rndef returnsegResult(sentence):rnrn segResult = []rn segList = jieba.cut(sentence)rnrn for w in segList:rn segResult.append(w)rn return segResultrnrnrn#获取 filepath 目录下的所有文件目录并返回rndef eachFile(filepath):rn pathDir = os.listdir(filepath)rn child=[]rn for allDir in pathDir:rn child.append(os.path.join('%s/%s' % (filepath, allDir)))rn return childrnrn#读取 filename路径的每一行数据 并返回 转换为GBKrndef readLines(filename):rn fopen = open(filename, 'rb',encoding='UTF-8')rn rn rn data=[]rn for x in fopen.readlines():rn if x.strip() != b'':rn data.append(x.strip())#data.append(unicode(x.strip(),"GBK"))rnrn fopen.close()rn return datarnrnrn#读取 filename路径 的每一行数据 并返回rndef readLines2(filename):rn fopen = open(filename, 'rb')#FILE_OBJECT= open('order.log','r', encoding='UTF-8')rn data=[]rn for x in fopen.readlines():rn if x.strip() != '':rn data.append(x.strip())#x.strip()rnrn fopen.close()rn return datarnrn#主要为情感定位 见程序文件相关代码 这里是为了速度 提取了部分代码 本来应该在classifyWords 里边 貌似对速度影响不大rndef words():rn #情感词rn senList = readLines2('E:/词库/BosonNLP_sentiment_score/BosonNLP_sentiment_score.txt')rn senDict = defaultdict()rn rn rn # for s in senList:rn # senDict[s.split()[0]] = s.split(' ')[1]rn #否定词rn notList = readLines2('E:/词库/notDict.txt')rn #程度副词rn degreeList = readLines2("E:/sentiment/degreeDict.txt")rn degreeDict = defaultdict()rn rn for d in degreeList:rn rn degreeDict[d.split(' ')[0]] = d.split(' ')[1]rn rn return senDict,notList,degreeDictrnrn# (1) 情感词rnrn# 见文本文档 根据情感定位 获得句子相关得分rndef classifyWords(wordDict,senDict,notList,degreeDict):rnrn senWord = defaultdict()rn notWord = defaultdict()rn degreeWord = defaultdict()rn for word in wordDict.keys():rn if word in senDict.keys() and word not in notList and word not in degreeDict.keys():rn senWord[wordDict[word]] = senDict[word]rn elif word in notList and word not in degreeDict.keys():rn notWord[wordDict[word]] = -1rn elif word in degreeDict.keys():rn degreeWord[wordDict[word]] = degreeDict[word]rn return senWord, notWord, degreeWordrnrnrn#计算句子得分 见程序文档rndef scoreSent(senWord, notWord, degreeWord, segResult):rn W = 1rn score = 0rn # 存所有情感词的位置的列表rn senLoc = senWord.keys()rn notLoc = notWord.keys()rn degreeLoc = degreeWord.keys()rn senloc = -1rn # notloc = -1rn # degreeloc = -1rn # 遍历句中所有单词segResult,i为单词绝对位置rn for i in range(0, len(segResult)):rn # 如果该词为情感词rn if i in senLoc:rn # loc为情感词位置列表的序号rn senloc += 1rn # 直接添加该情感词分数rn score += W * float(senWord[i])rn # print "score = %f" % scorern if senloc < len(senLoc) - 1:rn # 判断该情感词与下一情感词之间是否有否定词或程度副词rn # j为绝对位置rn for j in range(senLoc[senloc], senLoc[senloc + 1]):rn # 如果有否定词rn if j in notLoc:rn W *= -1rn # 如果有程度副词rn elif j in degreeLoc:rn W *= float(degreeWord[j])rn # i定位至下一个情感词rn if senloc < len(senLoc) - 1:rn i = senLoc[senloc + 1]rn return scorernrnrn#列表 转 字典rndef listToDist(wordlist):rn data=rn for x in range(0, len(wordlist)):rn data[wordlist[x]]=xrn return datarnrn#绘图相关 自行百度下rndef runplt():rn plt.figure()rn plt.title('test')rn plt.xlabel('x')rn plt.ylabel('y')rn #这里定义了 图的长度 比如 2000条数据 就要 写 0,2000 rn plt.axis([0,1000,-10,10])rn plt.grid(True)rn return pltrnrnrnrnrn#主题从这里开始 上边全是方法rnrnrn#获取 test/neg 下所有文件 路径rnfilepwd=eachFile("E:/test/neg")rnrnscore_var=[]rnrnrn#获取 本地的情感词 否定词 程度副词rnwords_vaule=words()rnrn#循环 读取 filepwd (也就是test/neg目录下所有文件全部跑一下)rnfor x in filepwd:rn #读目录下文件的内容rn data=readLines(x,'rb')rn #对data内容进行分词rn datafen=sent2word(data[0])rn #列表转字典rn datafen_dist=listToDist(datafen)rn #通过classifyWords函数 获取句子的 情感词 否定词 程度副词 相关分值rn data_1=classifyWords(datafen_dist,words_vaule[0],words_vaule[1],words_vaule[2])rn # 通过scoreSent 计算 最后句子得分rn data_2=scoreSent(data_1[0],data_1[1],data_1[2],returnsegResult(data[0]))rn # 将得分保存在score_var 以列表的形式rn score_var.append(data_2)rn #打印句子得分rn print(data_2)rnrn#对所有句子得分进行倒序排列rnscore_var.sort(reverse=True)rnrn#计算一个index 值 存 1~ 所有句子长度 以便于绘图rnindex=[]rnfor x in range(0,len(score_var)):rn index.append(x+1)rnrn#初始化绘图rnplt=runplt();rn#带入参数rnplt.plot(index,score_var,'r.')rn#显示绘图rnplt.show();rnrn[/code]

关于python3.5中的bytes-like objectstr

11-06

最近学scrapy爬虫的时候,用CsvItemExporter将Item写入csv文件时,报错rn[quote]TypeError: write() argument must be str, not bytes[/quote]rn代码如下:rn[code=python]class StockPipelineCSV(object):rnrndef open_spider(self,spider):rn self.file = open('stocks_01.csv', 'w')rn self.exporter = CsvItemExporter(self.file)rn self.exporter.start_exporting()rnrndef close_spider(self,spider):rn self.exporter.finish_exporting()rn self.file.close()rnrndef process_item(self, item, spider):rn self.exporter.export_item(item)rn return item[/code]rn然后找到exporters的CsvItemExporter类中的export_item()函数以及其他相关函数:rn[code=python]#exporters.pyrndef export_item(self, item):rn if self._headers_not_written:rn self._headers_not_written = Falsern self._write_headers_and_set_fields_to_export(item)rnrn fields = self._get_serialized_fields(item, default_value='',rn include_empty=True)rn values = list(self._build_row(x for _, x in fields))rn self.csv_writer.writerow(values)rnrn def _build_row(self, values):rn for s in values:rn try:rn yield to_native_str(s, self.encoding)rn except TypeError:rn yield s[/code]rn其中用到了rn[code=python]#python.pyrndef to_native_str(text, encoding=None, errors='strict'):rn""" Return str representation of `text`rn(bytes in Python 2.x and unicode in Python 3.x). """rnif six.PY2:rn return to_bytes(text, encoding, errors)rnelse:rn return to_unicode(text, encoding, errors)[/code]rn发现这里没问题已经将item转换成存放str对象的一个list了,不知道问题究竟出在哪里?scrapy是初学,不知道是不是scrapy的itempipeline.py代码的问题?rn网上查了半天说是要用w+b二进制方式打开,这样确实不会报错了,但写进去之后是乱码,顺序也随机(这个可能是我settings.py里没有设置)rn然后我自己写了小程序测试,自己open一个csv文件,以w+b打开rn[code=python]# coding: utf-8rnrnimport csvrnrncsvfile = open('D://t.csv', 'w+b')rnwriter = csv.writer(csvfile)rnwriter.writerow([str.encode('列1'), str.encode('列2'), str.encode('列3')])rnrndata = [rn str.encode('值1'), str.encode('值2'), str.encode('值3')rn]rnwriter.writerow(data)rnrncsvfile.close()[/code]rn结果报错:rn[quote]TypeError: a bytes-like object is required, not 'str'[/quote]rn但我明明把他转换成bytes了啊。最后用w方式写入,正常了。但对bytes-like object和str者二者很困惑。rnrncsdn新人,不太会用,在技术问答那里也提了同样的问题。

没有更多推荐了,返回首页