把上次代码优化一下,直接读取CSV文件的某列数据进行处理。
先把CSV文件用notepad++打开,并且转化为UTF-8编码格式进行存储,
with open(FeilName,'rt', errors='ignore') as csvfile:
在这个函数中添加errors = 'ignore',这是因为文件包含中文字符集,有些字符UTF-8,或者GBK打不开就会报错。添加errors参数忽略错误。
import numpy as np
import pandas as pd
import csv
FeilName = "2022-6-8-pm1549Stop.csv"
#读取CSV文件,并且将所需要处理的一整列存储在column列表中
#最主要改变是添加errors参数
with open(FeilName,'rt', errors='ignore') as csvfile:
reader = csv.reader(csvfile)
column = [row[9] for row in reader]
print (column[2])#这个输出用来检测自己能否正常读取所需要的列
i = 1#读取列表时从下标1开始,(下标0是Header,如果有的话)
j = len(column)-1#获取列表长度
Roll_Data_lists = []#横滚角数据存储列表
Pitch_Data_lists = []#俯仰角数据存储列表
#列表中的数据形式是字符串数字,需要把列表中字符串转化为单个字符数字,存储到Datas_char中,再使用map函数将其转化为整型数字
while i <= j:
#str1 = "x| 00 00 13 00 00 04 00 00 "#原始字符串数据#这个用来测试整型数字的转化
Datas = list(column[i])#将字符串转换为单个字符列表
Datas_Char = []#单个字符存储列表
#将Datas列表中的无用字符剔除后存储在Datas_Char中
for data in Datas:
if ('0'<= data <='9'):
Datas_Char.append(data)
#将字符串列表转换为整数列表
Datas_Int = list(map(int, Datas_Char))
#读取俯仰角各个位数据
Sing_Figure_Pitch = Datas_Int[0]#符号位正负号
Bai_Figure_Pitch = Datas_Int[1]#百位
Shi_Figure_Pitch = Datas_Int[2]#十位
Ge_Figure_Pitch = Datas_Int[3]#个位
Point_One_Figure_Pitch = Datas_Int[4]#小数点后一位
Point_Two_Figure_Pitch = Datas_Int[5]#小数点后二位
#合并计算俯仰角大小储存在Pitch_Data中。Sing_Figure_Pitch为0,角度为正,为1,角度为负
if Sing_Figure_Pitch:
Pitch_Data = (Bai_Figure_Pitch*100 + Shi_Figure_Pitch*10 + Ge_Figure_Pitch + Point_One_Figure_Pitch*0.1 + Point_Two_Figure_Pitch*0.01)*(-1)
else:
Pitch_Data = (Bai_Figure_Pitch * 100 + Shi_Figure_Pitch * 10 + Ge_Figure_Pitch + Point_One_Figure_Pitch * 0.1 + Point_Two_Figure_Pitch * 0.01)
Pitch_Data = round(Pitch_Data, 2)#数据精确到小数点后两位
#print(Pitch_Data)#这个用来测试所需数据是否成功转化为整型并读取
Pitch_Data_lists.append(Pitch_Data)#俯仰角存储到列表中
#读取横滚角各个位数据
Sing_Figure_Roll = Datas_Int[6]#符号位
Bai_Figure_Roll = Datas_Int[7]#百位
Shi_Figure_Roll = Datas_Int[8]#十位
Ge_Figure_Roll = Datas_Int[9]#个位
Point_One_Figure_Roll = Datas_Int[10]#小数点后一位
Point_Two_Figure_Roll = Datas_Int[11]#小数点后二位
#合并计算横滚角大小储存在Roll_Data中。Sing_Figure_Roll为0,角度为正;为1,角度为负
if Sing_Figure_Roll:
Roll_Data = (Bai_Figure_Roll*100 + Shi_Figure_Roll*10 + Ge_Figure_Roll + Point_One_Figure_Roll*0.1 + Point_Two_Figure_Roll*0.01)*(-1)
else:
Roll_Data = (Bai_Figure_Roll*100 + Shi_Figure_Roll*10 + Ge_Figure_Roll + Point_One_Figure_Roll*0.1 + Point_Two_Figure_Roll*0.01)
Roll_Data = round(Roll_Data, 2)
#print(Roll_Data)#这个用来测试所需数据是否成功转化为整型并读取
Roll_Data_lists.append(Roll_Data)
i = i + 1
#这两个输出函数用来测试整型数字列表能否成功读取
#print(Pitch_Data_lists)
#print(Roll_Data_lists)
#将横滚角,俯仰角两列数据加到原来的CSV文件中
ngData = pd.read_csv(FeilName)#读取CSV文件
ngData["Pitch"] = Pitch_Data_lists
ngData["Roll"] = Roll_Data_lists
ngData.to_csv(FeilName,index=False)#默认没有索引
After:
序号,系统时间,时间标识,CAN通道,传输方向,ID号,帧类型,帧格式,长度,数据,Pitch,Roll 675942,15:16:46.131,0x10B437A,ch1,接收,0x0588,数据帧,标准帧,0x08,x| 00 00 13 00 00 04 00 00 ,0.13,0.04 675943,15:16:46.131,0x10B438B,ch1,接收,0x0587,数据帧,标准帧,0x08,x| 00 03 62 10 01 28 00 00 ,3.62,-1.28 675944,15:16:46.131,0x10B4397,ch1,接收,0x0586,数据帧,标准帧,0x08,x| 00 04 25 00 00 63 00 00 ,4.25,0.63 675945,15:16:46.131,0x10B43A6,ch1,接收,0x0585,数据帧,标准帧,0x08,x| 00 04 76 00 00 44 00 00 ,4.76,0.44 675946,15:16:46.131,0x10B43DE,ch1,接收,0x0588,数据帧,标准帧,0x08,x| 00 00 13 00 00 04 00 00 ,0.13,0.04 675947,15:16:46.131,0x10B43EF,ch1,接收,0x0587,数据帧,标准帧,0x08,x| 00 03 62 10 01 28 00 00 ,3.62,-1.28



