机器学习KNN分类器场景下,CSV列表字符串转整数的问题
嘿,我完全懂你这个痛点!之前做Arduino传感器数据喂给ML模型的时候,也踩过串行数据转类型+CSV存储的坑。咱们一步步拆解问题:
首先,你说代码编译没报错但CSV打开异常,大概率是写入CSV的格式不对——你是不是直接把Python列表(比如[520,521,...]这种带方括号的字符串)直接写进文件了?这样CSV软件会把整个列表当成一个单元格,自然显示异常。另外也可能是字符串转整数时没清理脏数据,导致隐藏问题。
先解决核心问题:正确把整数数据写入CSV
别直接写列表的字符串形式,用Python的csv模块来处理,它会帮你生成标准的逗号分隔格式:
import csv # 假设你已经从串口拿到了字符串列表,比如string_list = ['520','521','156','179','191'] # 第一步:把字符串转成整数,同时清理可能的空白字符(比如串口传过来的换行、空格) try: int_data = [int(s.strip()) for s in string_list] except ValueError as e: print(f"注意:有无效数据无法转成整数,错误信息:{e}") # 这里可以选择跳过这条数据,或者记录日志 # 第二步:用csv.writer写入文件,确保每一行是标准的CSV列 # 如果是追加数据用'a',如果是新建文件用'w',记得加newline=''避免换行混乱 with open('your_data.csv', 'a', newline='') as f: writer = csv.writer(f) writer.writerow(int_data) # 这会把整数列表写成逗号分隔的一行:520,521,156,179,191
额外避坑提示
- 串口数据清理:Arduino发送数据时,可能会带换行符
\n或回车符\r,接收后一定要用.strip()去掉,不然字符串是'520\n',虽然转int没问题,但写入时可能导致CSV换行异常。 - 异常处理:串行传输偶尔会丢包或乱码,比如收到
'52a'这种非数字字符串,直接转int会崩溃,所以一定要加try-except捕获,避免程序挂掉。 - 文件打开模式:用
'a'追加数据时,不要忘了newline='',不然Windows系统下会自动多插空行,导致CSV显示异常。
完整的串口读取+转换+写入示例
给你一个能直接用的流程代码,适配你的场景:
import serial import csv # 初始化串口(替换成你的端口号和波特率) ser = serial.Serial('COM3', 9600, timeout=1) # 先创建CSV文件并写表头(如果需要的话) with open('sensor_data.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['传感器1', '传感器2', '传感器3', '传感器4', '传感器5']) print("开始接收数据...") while True: # 读取串口一行数据,解码成字符串并清理空白 raw_data = ser.readline().decode('utf-8').strip() if raw_data: # 按逗号分割成单个数据字符串 string_list = raw_data.split(',') # 转换为整数 try: int_data = [int(s.strip()) for s in string_list] # 写入CSV with open('sensor_data.csv', 'a', newline='') as f: writer = csv.writer(f) writer.writerow(int_data) print(f"已保存数据:{int_data}") except ValueError: print(f"跳过无效数据:{raw_data}")
这样处理后,你打开CSV文件应该就是整整齐齐的列数据了,KNN分类器直接读整数就行~
内容的提问来源于stack exchange,提问作者JWGSolitude
相关产品推荐
相关产品推荐

