通过Socket发送CSV列表遇TypeError及格式异常,求解决方案
解决UDP Socket传输CSV文件时的格式混乱与数据拆分问题
你遇到的核心问题其实是两个:CSV行的格式转换错误,以及UDP数据报的拆分/拼接处理不当,咱们一步步来解决:
问题根源拆解
- 客户端发送逻辑错误:用
csv.reader读取每行得到的是列表(比如['201','8','0040000080']),直接str(line)会把列表转成带括号和引号的字符串(比如"['201', '8', '0040000080']"),这完全偏离了原始CSV的行格式,服务器自然解析混乱。 - UDP数据拆分问题:UDP是基于数据报的,但
recvfrom(1024)每次最多接收1024字节,若行长度超过阈值或受网络影响,会被拆分成多个包;同时多个小包也可能被合并,导致服务器无法识别完整单行。 - 服务器写入逻辑错误:直接把接收的字节数据传给
csv_writer.writerow(),它会把每个字节(或字符)当成单独的列表元素,所以才会出现201被拆成['2','0','1']的情况。
针对性解决方案
方案1:直接传输原始CSV行(最简单高效)
既然要原样传输CSV内容,没必要用csv.reader解析后再转换,直接读取文件原始行发送即可:
客户端修改代码
import socket clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 用文本模式读取,保留原始行格式 with open('can_data.csv', 'r', newline='') as csv_file: for line in csv_file: # 去掉多余换行符(可选),转成字节发送 line_bytes = line.strip('\n').encode('utf-8') clientSock.sendto(line_bytes, (self.address, self.port))
服务器修改代码
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('你的服务器IP', 你的端口号)) with open('output.csv', 'w', newline='') as new_file: while True: data, addr = s.recvfrom(1024) # 字节转字符串,添加换行符后写入 line = data.decode('utf-8') + '\n' new_file.write(line) # 可选:添加退出逻辑,比如收到特定标识 # if line == 'exit\n': # break
方案2:用CSV模块正确解析与重构(适合需预处理数据的场景)
如果需要在客户端先处理CSV数据再发送,要把列表重新拼接成原始CSV行:
客户端修改代码
import socket import csv clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) with open('can_data.csv', 'r', newline='') as csv_file: csv_reader = csv.reader(csv_file) for row in csv_reader: # 把列表元素用逗号拼接成原始行字符串 csv_line = ','.join(row) clientSock.sendto(csv_line.encode('utf-8'), (self.address, self.port))
服务器修改代码
若想继续用csv_writer写入,需把接收的行拆分成列表:
import socket import csv s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('你的服务器IP', 你的端口号)) with open('output.csv', 'w', newline='') as new_file: csv_writer = csv.writer(new_file) while True: data, addr = s.recvfrom(1024) csv_line = data.decode('utf-8') # 把行拆分成列表,交给writerow处理 row = csv_line.split(',') csv_writer.writerow(row)
额外注意事项
- UDP的不可靠性:UDP不保证数据有序或不丢失,如果你的场景需要可靠传输,建议改用TCP Socket。
- 换行符处理:用
newline=''打开CSV文件是Python官方推荐方式,可避免不同系统下的换行符混乱。 - 编码一致性:确保客户端和服务器使用相同编码(比如
utf-8),避免出现乱码。
内容的提问来源于stack exchange,提问作者omom007
相关产品推荐
相关产品推荐

