csv文件
二进制写入模式 wb(如果已创建将清空数据,谨慎使用!)
二进制添加模式 ab
二进制读取模式 rb
写入的话可以直接按照二维数组写入,第一行写入每列的名称以便参考
#!/usr/bin/env python
import rospy
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import rospkg
import csv
import sys
if __name__ == '__main__':
rospy.init_node('AutoSaveCSV', anonymous=True)
rospack = rospkg.RosPack()
path = rospack.get_path('xxx')
rate = rospy.Rate(0.1) # 1hz
comparisonmap=[]
while not rospy.is_shutdown():
now = datetime.now()
date_time = now.strftime("%Y%m%d")
csv_name = 'prefix'+date_time+'.csv'
csvfile = file(path+'/experiment/'+ csv_name, 'wb')
csvfile.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(csvfile)
writer.writerow(['id','est_x', 'y','qz','qw','ref_x', 'y','qz','qw','best_x','best_y','best_z','energy','vt_id'])
path = np.array(map).astype(float)
writer.writerows(path)
csvfile.close()
print 'save to file ',csv_name,' ' ,len(comparisonmap)
rate.sleep()
读取的时候需要进行额外操作:
from ast import literal_eval
next(reader_ls, None)#skip first line
np.array(literal_eval(row[2])).astype(float) 将含有[]中括号的二维数组或者list字符串转换为二维float数组
now = datetime.now()
date_time = now.strftime("%Y%m%d")
rospack = rospkg.RosPack()
path = rospack.get_path('xxx')
csv_name_ls = 'filename.csv'
csvfile_ls = open(path+'/experiment/'+ csv_name_ls, 'rb')
reader_ls = csv.reader(csvfile_ls)
print 'laserscan data import from ',csv_name_ls
next(reader_ls, None)#skip first line
#'t','id', '[range angle]'
for row in reader_ls:
row_arr = np.array(row[0:2]).astype(float)
if row[2] != '[]':
laser_arr = np.array(literal_eval(row[2])).astype(float)
laser_scan=[]
for i in np.arange(0,laser_arr.shape[0],skip_ls):
laser_scan.append(laser_arr[i])
exp = experience(laser_scan,int(row_arr[1]))
else:
exp = experience(None,int(row_arr[1]))
laserscan_list.append(exp)