Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在从Python2.7更改为Python3.7之后,数据是否得到了一个额外的字母?_Python_Raspberry Pi - Fatal编程技术网

在从Python2.7更改为Python3.7之后,数据是否得到了一个额外的字母?

在从Python2.7更改为Python3.7之后,数据是否得到了一个额外的字母?,python,raspberry-pi,Python,Raspberry Pi,我正在开发一个程序,该程序接收通过WiFi发送的Android应用程序的字符串,该程序最初是为Python 2.7编写的,但在添加了一些附加功能后,我将其更改为Python 3.7。然而,在做了这样的改变之后,我的数据在前面有一个额外的字母,就我的一生而言,我不明白为什么会这样 下面是我的一段代码,这是一个非常简单的if语句,可以查看哪个命令是从Android应用程序发送的,并用该命令控制Raspberry Pi(4)cam(v.2) 这部分设置连接并等待查看我发送的命令 isoCmd = ['

我正在开发一个程序,该程序接收通过WiFi发送的Android应用程序的字符串,该程序最初是为Python 2.7编写的,但在添加了一些附加功能后,我将其更改为Python 3.7。然而,在做了这样的改变之后,我的数据在前面有一个额外的字母,就我的一生而言,我不明白为什么会这样

下面是我的一段代码,这是一个非常简单的if语句,可以查看哪个命令是从Android应用程序发送的,并用该命令控制Raspberry Pi(4)cam(v.2)

这部分设置连接并等待查看我发送的命令

isoCmd = ['auto','100','200','300','400','500','640','800']

HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)
brightness = 50
timelapse = 0


tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
        print ('Waiting for connection')
        tcpCliSock,addr = tcpSerSock.accept()
        try:
                while True:
                        data = ''
                        brightness = ' '
                        data = tcpCliSock.recv(BUFSIZE)
                        dataStr = str(data[1:])
                        print ("Here's data ",dataStr)
                        if not data:
                                break
                        if data in isoCmd:
                                if data == "auto":
                                        camera.iso = 0
                                        print ('ISO: Auto')
                                else:
                                        camera.iso = int(data)
                                        print ('ISO: '), data
当我启动程序时,我看到的是:

Waiting for connection
#If I send command '300'
Here's data b'300'
Here's data b''
Waiting for connection

我不知道为什么会有额外的
b'
来自哪里。我通过在数组中每个项目的开头添加“b”来测试代码,该数组适用于我定义的任何命令,而不适用于控制Pi摄像机的任何命令,因为在开头没有额外的b。(这有意义吗?)我的意思是,我知道我可以发送命令,没问题,只是不知道如何摆脱多余的字母。如果有人能给我一些建议那就太好了。感谢您的帮助。

字节字符串由b前缀表示。 虽然打印时可以在输出中看到字符串,但它们本质上是字节

要从中提取正常字符串,
decode
函数可以提供帮助

dataStr.decode("utf-8")

b'data'
简单地说,引号中的数据是以字节形式接收的,正如其他答案中提到的,您必须使用
decode('utf-8')
对其进行解码,才能以字符串形式获取

我已在下面更新了您的程序,以兼容v3.7+

从套接字导入*
isoCmd=[‘自动’、‘100’、‘200’、‘300’、‘400’、‘500’、‘640’、‘800’]
主机=“”
端口=21567
BUFSIZE=1024
地址=(主机,端口)
亮度=50
时间点=0
tcpSerSock=套接字(AF\u INET,SOCK\u STREAM)
tcpSerSock.bind(地址)
听一听(5)
尽管如此:
打印('等待连接')
tcpCliSock,addr=tcpSerSock.accept()
尝试:
尽管如此:
数据=“”
亮度=“”
data=tcpCliSock.recv(BUFSIZE).decode('utf-8')
打印(“此处的数据”+数据)
如果没有数据:
打破
如果数据在isoCmd中:
如果数据==“自动”:
camera.iso=0
打印('ISO:Auto')
其他:
camera.iso=int(数据)
打印('ISO:'+数据)
例外情况除外,如e:
打印(e)

b是表示字节字符串的前缀。这意味着您将获得一个字节字符串…您可以使用.decode()方法对其进行解码,如果已知/必要,还可以提供编码。如果您确定数据只包含字母或数字,请尝试以下操作:
dataStr.decode(“utf-8”)
@Abhilash,效果非常好!还有很多东西要学。。。谢谢