You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Socket发送CSV列表遇TypeError及格式异常,求解决方案

解决UDP Socket传输CSV文件时的格式混乱与数据拆分问题

你遇到的核心问题其实是两个:CSV行的格式转换错误,以及UDP数据报的拆分/拼接处理不当,咱们一步步来解决:

问题根源拆解

  1. 客户端发送逻辑错误:用csv.reader读取每行得到的是列表(比如['201','8','0040000080']),直接str(line)会把列表转成带括号和引号的字符串(比如"['201', '8', '0040000080']"),这完全偏离了原始CSV的行格式,服务器自然解析混乱。
  2. UDP数据拆分问题:UDP是基于数据报的,但recvfrom(1024)每次最多接收1024字节,若行长度超过阈值或受网络影响,会被拆分成多个包;同时多个小包也可能被合并,导致服务器无法识别完整单行。
  3. 服务器写入逻辑错误:直接把接收的字节数据传给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:16:41