如何附加大块腌制的熊猫DataFrame

时间:2019-01-17 08:46:40

标签: python-3.x pandas sockets pickle

我已经在服务器上腌制了一个熊猫数据框,并且正在通过套接字连接发送它,我可以接收数据,但是我似乎无法将数据块重新附加到原始的数据框格式中我正在努力实现!我有一种感觉,因为data = []而将其追加到列表中,但是我尝试了一个空的pd Dataframe,但这种方法不起作用,所以我对添加这些内容的方法有点不知所措值

    data = []
    FATPACKET = 0
    bytelength = self.s.recv(BUFFERSIZE)
    length = int(pickle.loads(bytelength))
    print(length)
    ammo = 0

    while True:
        print("Getting Data....")
        packet = self.s.recv(1100)
        FATPACKET = int(sys.getsizeof(packet))
        ammo += FATPACKET
        print(str(FATPACKET) + '  Got this much of data out of '   +str(length))
        print("Getting Data.....")
        data.append(packet)
        print(ammo)
        if not ammo > length:
            break
    print(data)
    unpickled = pickle.loads(data)
    self.s.close()
    print("Closing Connection!")
    print(unpickled)

当我尝试这段代码时,我经常遇到这个问题

TypeError:需要一个类似字节的对象,而不是“列表”

或者我碰到这个

_pickle.UnpicklingError:无效的加载密钥'\ x00'

这是我腌制的数据框的前几位,对不起,这是我第一次搞砸腌制模块,所以我不是很了解

1 个答案:

答案 0 :(得分:0)

如果我们还能在发送端准确地看到您在做什么,这将有所帮助。但是,显然您有几个问题。

首先,在初始recv中,很明显,您打算只获取用来编码剩余字节长度的初始pickle对象。但是,recv 可能还会接收剩余字节的初始段(或什至是剩余字节的 all ,具体取决于其大小)。因此,您应该将多少钱分配给首字母pickle.loads

最好创建一个固定长度的字段以包含剩余数据的大小。这通常是通过struct模块来完成的。在发送方:

import struct
# Pickle the data to be sent
data = pickle.dumps(python_obj)
data_len = len(data)
# Pack data length into 4 bytes, encoded in network byte order
data_len_to_send = struct.pack('!I', data_len)  
# Send exactly 4 bytes (due to 'I'), then send data
conn.sendall(data_len_to_send)
conn.sendall(data)

在接收方,如例外情况所述,pickle.loads采用字节串而不是列表。因此,解决此问题的一部分将是在调用loads之前将所有列表元素连接到一个字节字符串中:

unpickled = pickle.loads(b''.join(data))

接收端的其他问题:使用len(packet)获取缓冲区大小。 sys.getsizeof提供了bytes对象使用的内部存储器,其中包括未指定的解释器开销,在这里不是您所需要的。

recv之后,您要做的第一件事是检查一个空缓冲区,该缓冲区指示流的末尾(甚至是len(packet) == 0packet == ''not packet) 。例如,如果发件人在完成发送之前被杀死(或者网络链接断开,或者发件人一方出现了一些错误,等等),就会发生这种情况。否则,如果连接过早终止,则您的程序将永远无法到达break,因此它将处于非常紧密的无限循环中。

因此,您完全可以执行以下操作:

# First, obtain fixed-size content length
buf = b''
while len(buf) < 4:
    tbuf = recv(4 - len(buf))
    if tbuf == '':
        raise RuntimeError("Lost connection with peer") 
    buf += tbuf

# Decode (unpack) length (note that unpack returns an array)
len_to_recv = struct.unpack('!I', buf)[0]

data = []
len_recved = 0
while len_recvd < len_to_recv:
    buf = self.s.recv(min(len_to_recv - len_recvd, BUFFERSIZE))
    if buf == '':   
        raise RuntimeError("Lost connection with peer") 
    data.append(buf)
    len_recvd += len(buf)

unpickled_obj = pickle.loads(b''.join(data))

编辑:移动括号