python——TypeError: 'str' does not support the buffer interface

import socket
import sys

port=51423
host="localhost"

data=b"x"*10485760                      #在字符串前加 b 是字符串变为bytes类。
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((host,port))

byteswritten=0
while byteswritten<len(data):
    startpos = byteswritten
    endpos = min(byteswritten+1024,len(data))
    byteswritten+=sock.send(data[startpos:endpos])
    sys.stdout.write("wrote %d bytes\r"% byteswritten)
    sys.stdout.flush()

sock.shutdown(1)

print("All data sent.")
while True:
    buf = sock.recv(1024).decode()            #.decode()函数把bytes类型转化为str类型。
    if not len(buf):
        break
    sys.stdout.write(buf)

问题解决:

In python 3, bytes strings and unicode strings are now two different types. Since sockets are not aware of string encodings, they are using raw bytes strings, that have a slightly different interface from unicode strings.

在python 3里,bytes类型和unicode字符串类型现在已经是两种不同的类型了。现在,socket的模块无法识别unicode str类型,它们现在使用bytes字节类。

So, now, whenever you have a unicode string that you need to use as a byte string, you need to encode() it.

And when you have a byte string, you need to decode it to use it as a regular(python 2.x) string.

所以,现在无论什么时候你有一个unicode str类但是你需要一个bytes类,你需要使用encode()函数转换它。

当你有一个bytes类型时,你需要用decode()函数转换它,作为一个普通unicode字符串。

Unicode strings are quotes enclosed strings. Bytes strings are b"" enclosed strings

unicode str类直接用引号“ *** ”包含就可以,bytes字符串则需要在引号“ ”前加b。b“ test string ”

When you use client_socket.send(data),replace it by client_socket.send(data.encode()).

当你使用socket.send(data)时,用socket.send(data.encode())代替。

When you get data using data = client_socket.recv(512),replace it by data =client_socket.recv(512).decode()

当你使用data=socket.recv(512)时,用socket.recv(512).decode()代替。

============================================知识扩展========================================

一、Python 3的bytes/str之别

原文:The bytes/str dichotomy in Python 3

了解了bytes/str之别,理解codecs模块就容易了。

Python
3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。
Python
3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也
不能将字符串传入参数为字节包的函数(反之亦然)。这是件好事

不管怎样,字符串和字节包之间的界线是必然的,下面的图解非常重要,务请牢记于心:

字符串可以编码成字节包,而字节包可以解码成字符串。

>>> ‘€20‘.encode(‘utf-8‘)
b‘\xe2\x82\xac20‘
>>> b‘\xe2\x82\xac20‘.decode(‘utf-8‘)
‘€20‘

这个问题要这么来看:字符串是文本的抽象表示。字符串由字符组成,字符则是与任何特定二进制表示无关的抽象实体。在操作字符串时,我们生活在幸福的 无知之中。我们可以对字符串进行分割和分片,可以拼接和搜索字符串。我们并不关心它们内部是怎么表示的,字符串里的每个字符要用几个字节保存。只有在将字 符串编码成字节包(例如,为了在信道上发送它们)或从字节包解码字符串(反向操作)时,我们才会开始关注这点。

传入encode和decode的参数是编码(或codec)。编码是一种用二进制数据表示抽象字符的方式。目前有很多种编码。上面给出的UTF-8是其中一种,下面是另一种:

>>> ‘€20‘.encode(‘iso-8859-15‘)
b‘\xa420‘
>>> b‘\xa420‘.decode(‘iso-8859-15‘)
‘€20‘

编码是这个转换过程中至关重要的一部分。离了编码,bytes对象b‘\xa420‘只是一堆比特位而已。编码赋予其含义。采用不同的编码,这堆比特位的含义就会大不同:

>>> b‘\xa420‘.decode(‘windows-1255‘)
‘?20‘

二、codecs 模块简介

codecs是encoders和decoders的缩写。

codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的
codecs.CodecInfo 对象,该对象包含了
encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。为了简化对lookup方法的调用,
codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和
getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和
StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对
encoder和decoder的双向服务。

这个模块的强大之处在于它提供了流的方式来处理字符串编码,当处理的数据很多时,这种方式很有用。
你可以使用IncrementalEncoder和IncrementalDecoder,但是强烈建议使用StreamReader和StreamWriter,因为使用它们会大大简化你的代码。

例如,有一个test.txt的文件,它的编码为gbk,现在我需要将它的编码转换为utf8,可以编写如下代码:

[python] view plaincopy

    1. #coding:utf8 2
    2. import codecs
    3. # 打开文件 如果此处用codecs.open()方法打开文件,就不用创建reader和writer
    4. fin = open(‘test.txt‘, ‘r‘)
    5. fout = open(‘utf8.txt‘, ‘w‘)
    6. # 获取 StreamReader
    7. reader = codecs.getreader(‘gbk‘)(fin)
    8. # 获取 StreamWriter
    9. writer = codecs.getwriter(‘utf8‘)(fout)
    10. din = reader.read(10)
    11. while din:
    12. writer.write(din)
    13. din = reader.read(10)

python——TypeError: 'str' does not support the buffer interface

时间: 2024-11-09 00:28:23

python——TypeError: 'str' does not support the buffer interface的相关文章

Python错误:TypeError:&#39;str&#39; does not support the buffer interface

在socket套接字模块进行send和recv方法时出现这种问题,是因为Python3.x和Python2.x版本变化,In python 3, bytes strings and unicodestrings are now two different types. 相互之间需要进行转换decode()和encode(). send()需要的参数为bytes类型,因此需要对str进行encode() recv()返回的是bytes类型,因此我们需要对返回的bytes进行decode()转换为s

python TypeError: unsupported operand type(s) for +: &#39;geoprocessing value object&#39; and &#39;str&#39;

TypeError: unsupported operand type(s) for +: 'geoprocessing value object' and 'str' if self.params[0].value: mypath=self.params[0].value # cpath=mypath+os.sep+dataset arcpy.env.workspace =cpath 修改如下: if self.params[0].value: mypath=str(self.params[0

TypeError: &#39;str&#39; object is not callable

Python报错TypeError: 'str' object is not callable TypeError: 'str' object is not callable

5.6.序列类型—str,unicode,list,tuple,bytearray,buffer,xrange

Python一共有七种序列类型:strings,Unicode strings,lists,tuples,bytearrays,buffers,以及xrange对象. 对于其他容器可以查阅内置的dict和set类以及collections模块. 字符串常量(String literals)使用单引号或双引号来引用:比如,‘xyzzy',"frobozz".您可以查找字符串常量章节来得到更多信息.Unicode strings看起来非常像strings,但是它在语法上的特别之处在于你需要

python TypeError: &amp;#39;builtin_function_or_method&amp;#39; object is not iterable keys

statinfo = os.stat( OneFilePath ) if AllFiles.has_key( statinfo.st_size ): OneKey = AllFiles[ statinfo.st_size ] OneKey.append( OneFilePath ) AllFiles[ statinfo.st_size ] = OneKey else: if statinfo.st_size > MinSize: # print statinfo.st_size AllFiles

python TypeError: &#39;builtin_function_or_method&#39; object is not iterable keys

statinfo = os.stat( OneFilePath ) if AllFiles.has_key( statinfo.st_size ): OneKey = AllFiles[ statinfo.st_size ] OneKey.append( OneFilePath ) AllFiles[ statinfo.st_size ] = OneKey else: if statinfo.st_size > MinSize: # print statinfo.st_size AllFiles

Python“TypeError: &#39;NoneType&#39; object is not iterable&quot;的原因

本来不想说的,但是发现大家都遇到了该问题,由于该问题编译器提示较模糊,一般仅仅说for循环的参数没有定义,不能迭代. 具体如下截图: 其实问题不是参数,而是我们在使用参数的过程中错误了,大家可以看图上的提示就能够明白,192.168.1.1/32和192.168.1.1/24的区别,请大家以后在python中遇到类似问题是不要慌张. Python"TypeError: 'NoneType' object is not iterable"的原因,布布扣,bubuko.com Python

python TypeError: &#39;NoneType&#39; object is not iterable

list(set(map(lambda tp_id : tp_id if not ('#' in tp_id) and len(tp_id.strip().replace('\n', '')) > 0else None, open('tp_list.txt').readlines()).sort())) 为了练习map,想着把一个循环写成一行代码. 结构跑程序时出了一个问题:TypeError: 'NoneType' object is not iterable. 找了半天错误(写成一行代码在这

python的str,unicode对象的encode和decode方法

python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byte[]. 而python中的unicode对象应该才是等同于java中的String对象,或本质上是java的char[]. 对于 s="你好" u=u"你好" s="你好" u=u"你好" 1. s.decode方法和u.enc