Arrays 使用套接字发送列表
我正在尝试将列表从服务器发送到客户端。 列表如下所示(它是一个csv文件) 但在发送时,我收到以下错误:Arrays 使用套接字发送列表,arrays,python-2.7,csv,sockets,stream,Arrays,Python 2.7,Csv,Sockets,Stream,我正在尝试将列表从服务器发送到客户端。 列表如下所示(它是一个csv文件) 但在发送时,我收到以下错误: TypeError:必须是字符串或缓冲区,而不是list 我尝试了两种选择: 迭代列表并将每个字符串发送到服务器,但结果是: 201--->2,0,1 尝试铸造每一行,例如str(line),然后发送,但得到以下结果: 201,80040000080--->[,',2,0,1',,,,,,,,,,,,,,,,,,,0,0,4,0,0,0,0,0,8,0',] 我怎样才能解决这个问题?我只想按
TypeError:必须是字符串或缓冲区,而不是lis
t
我尝试了两种选择:
import socket
import csv
clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
with open('can_data.csv', 'rb') as csv_file:
csv_reader = csv.reader(csv_file)
for line in csv_reader:
clientSock.sendto(str(line), (self.address, self.port))
服务器代码:
with open('output.csv', 'wb') as new_file:
csv_writer = csv.writer(new_file)
while True:
data, addr = s.recvfrom(1024)
csv_writer.writerow(data)
双方需要就序列化格式达成一致
str(line)
在与ast.literaleval()
配对时可能会起作用,但是repr(line)
将是更好的选择,因为repr
尝试更精确地表示str
。您还可以使用类似于pickle
或json
的序列化协议
假设这是Python3,我还将csv移动到文本,并在线路上使用utf-8编码
客户:
import socket
import csv
address = 'localhost'
port = 5555
clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
with open('can_data.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
for line in csv_reader:
clientSock.sendto(repr(line).encode('utf-8'), (address, port))
服务器:
import socket
import csv
import ast
address = 'localhost'
port = 5555
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((address, port))
with open('output.csv', 'w') as new_file:
csv_writer = csv.writer(new_file)
while True:
data, addr = sock.recvfrom(1024)
csv_writer.writerow(ast.literal_eval(data.decode('utf-8')))
您的数据需要以某种方式序列化
pickle
和json
是两个很好的选择。或者,在处理之前发送csv文本文件。可能重复的我有一个问题,服务器没有写入所有行。原始文件有65000行,输出约有35000行,是什么导致此问题?
import socket
import csv
import ast
address = 'localhost'
port = 5555
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((address, port))
with open('output.csv', 'w') as new_file:
csv_writer = csv.writer(new_file)
while True:
data, addr = sock.recvfrom(1024)
csv_writer.writerow(ast.literal_eval(data.decode('utf-8')))