首页 > 解决方案 > 将列表转换为字符串时出现ValueError

问题描述

我在 2 台主机上有一个 udp 侦听器功能。它的行为应该是这样的:每当 host1 收到以“10.0.0”开头的 udp 消息时,它会将列表转换为字符串并通过 udp 套接字发送。如果有任何其他消息到达 host1,它会将消息从字符串转换为列表。这是代码:

def read_udp(s):
    data,addr = s.recvfrom(1024)
    if data.startswith('10.0.0'):
        data_split = data.split(" ")
        num = int(data_split[1])
        ipToTransfer = address
        transferStart = start[-num:]   
        msg = pickle.dumps(transferStart)
        udp_send(msg, ipToTransfer)
    else:
        recvStart = pickle.loads(data)

def udp_send(s, ip):
    UDP_IP = ip
    if(type(s) == str):
        MESSAGE = s
    else:
        MESSAGE = pickle.dumps(s)   
    print ("UDP target IP & port:", UDP_IP, port)
    #print ("message:", MESSAGE)
    sock3 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
    sock3.sendto(MESSAGE, (UDP_IP, port))

当列表的长度低于 60 ~ 65 时,此代码运行良好,但当列表长度超过此值时,我遇到错误提示:

File "process.py", line 273, in <module>
   run
File "process.py", line 127, in read_udp
   recvStart = pickle.loads(data)
File "/usr/lib/python2.7/pickle.py", line 1388, in loads
   return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 864, in load
   dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 960, in load_float
   self.append(float(self.readline()[:-1]))
ValueError: could not convert string to float

这是我的代码的第 127 行:recvStart = pickle.loads(data)

怎么了?我无法弄清楚这个问题,因为当我的列表长度低于 60 时它正在工作。

我测试了 2 个场景。在第一个中,列表中有 8 个元素,每个元素的 pickle.dumps 输出如下所示:

列表中的元素:1549286402.7232 pickle.dump 输出:aF1549286402.7232

但是现在当我用列表中的 60 个元素对其进行测试时,列表中每个元素的输出都像以前一样,但是a.列表的字符串表示形式的末尾有一个。这是什么,这是我的问题的原因吗?

标签: pythonstringlist

解决方案


推荐阅读