python2.7和python 3.4中的ord函数有什么不同?

Abo*_*gie 4 python python-2.7 python-3.x

我一直在运行一个脚本,我使用该ord()函数,无论在python 2.7中的原因是什么,它都接受unicode字符串字符,并且输出一个整数.

在python 3.4中,情况并非如此.这是正在生成的错误输出:

Traceback (most recent call last):
  File "udpTransfer.py", line 38, in <module>
    buf.append(ord(c))
TypeError: ord() expected string of length 1, but int found
Run Code Online (Sandbox Code Playgroud)

当我查看两个文档时,ord函数被解释为做同样的事情.

这是我用于两个python版本的代码:

import socket,sys, ast , os, struct
from time import ctime
import time
import csv


# creating the udo socket necessary to receive data
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip = '192.168.10.101' #i.p. of our computer
port = 20000 # socket port opened to connect from the matlab udp send data stream
server_address = (ip, port)

sock.bind(server_address)   # bind socket

sock.settimeout(2)          # sock configuration
sock.setblocking(1)
print('able to bind')
ii = 0
shotNummer = 0
client = ''
Array = []
byte = 8192
filename = time.strftime("%d_%m_%Y_%H-%M-%S")
filename = filename + '.csv'
try :
    with open(filename,'wb') as csvfile :
        spamwriter = csv.writer(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL)
        # spamwriter.writerow((titles))
        # as long as data comes in, well take it
        while True:
            data,client = sock.recvfrom(byte)
            buf = []
            values = []
            for c in data:
                # print(type(c))
                buf.append(ord(c))
                if len(buf) == 4 :
                    ###
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么python3.4它说c是一个整数,而不是在Python 2.7中它实际上是一个字符串,就像ord()函数需要的那样?

Mar*_*ers 9

您正在传递一个整数,以ord()在Python 3那是因为你迭代一个bytes在Python 3(从元组返回值的第一个元素对象socket.recvfrom()):

>>> for byte in b'abc':
...     print(byte)
...
97
98
99
Run Code Online (Sandbox Code Playgroud)

bytes类型文档:

字节文字和表示基于ASCII文本,而字节对象实际上表现为不可变的整数序列[.]

由于字节对象是整数序列(类似于元组),对于字节对象b,b[0]将是一个整数[...].

Python 2中,socket.recvfrom()生成一个str对象,并且对这样的对象进行迭代会给出新的单字符字符串对象,这些对象确实需要传递给ord()转换为整数.

您可以使用bytearray()此处在Python 2和3中获取相同的整数序列:

for c in bytearray(data):
    # c is now in integer in both Python 2 and 3
Run Code Online (Sandbox Code Playgroud)

ord()在这种情况下,您根本不需要使用.


Lia*_*lly 5

我认为区别在于 Python 3 中的sock.recvfrom(...)调用返回字节,而 Python 2.7 recvfrom 返回一个字符串。所以ord没有改变,但传递给 ord 的内容已经改变。

Python 2.7 recvfrom

Python 3.5 recvfrom