处理点云数据的心得
使用xlwt
对xls进行写操作
使用xlrd
对xls进行读操作,可以直接读出文件的行数和列数
使用pandas
也可以对csv、xls文件进行读写、两种格式转换,将两个文件进行合并在一起,将多个sheet列表整合在一个文件中
NOTE: csv类似于txt格式,针对csv格式,有专门的csv模块处理
程序如下:
from __future__ import division
import shutil
import pandas as pd #Pandas使用一个二维的数据结构DataFrame来表示表格式的数据,相比较于Numpy,Pandas可以存储混合的数据结构,同时使用NaN来表示缺失的数据
import matplotlib #绘制曲线图
import matplotlib.pyplot as plt
import xlrd #用于处理excel文件
import xlwt
from xlrd import open_workbook
import matplotlib as mpl
import os #用于处理文件
import sys #系统操作,带上就行了
import csv
##脚本81,84,89可用于修改txt文档的隔开形式(' ' , ',' , '\t')
filedir = os.path.dirname(sys.argv[0]) #获取脚本所在目录
os.chdir(filedir) #将脚本所在的目录设置为工作目录
wdir = os.getcwd() #返回当前目录
print('当前工作目录:{}\n'.format(wdir)) #打印当前工作目录
for parent, dirs, files in os.walk(wdir):
i = 1
parent_base = os.path.basename(parent) # 返回path最后的文件名
if 'data' in parent_base: #判断data文件夹是否存在
os.chdir('data') #将data文件夹设置为当前目录
for file in files:
# file_ext = file.split('.')[-1] #返回文件的路径和文件名
file_qian = file.split('.')[-2] #对文件进行rename
tmp = parent.split('\\')
# new_name = 'data' + '/' + 'obj' + '/' + str(i).zfill(8) + '.' + file_ext
new_name = file_qian + '.' + 'txt'
old_path = os.path.join(parent, file) # 分离的部分合成一个整体
new_path = os.path.join(parent, new_name)
os.rename(old_path, new_path)
i += 1
print('已完成 abc -- > txt 格式转化')
filedir = os.path.dirname(sys.argv[0]) #获取脚本所在目录
os.chdir(filedir) #将脚本所在的目录设置为工作目录
wdir = os.getcwd() #返回当前目录
print('当前工作目录:{}\n'.format(wdir)) #打印当前工作目录
for parent, dirs, files in os.walk(wdir): #遍历脚本目录所有文件
i = 0
parent_base = os.path.basename(parent) # 返回path最后的文件名
if 'data' in parent_base:
print(parent)
os.chdir(parent)
#os.chdir('data')
os.mkdir('results')
w = 0
list = []
writer = pd.ExcelWriter('many_sheets.xls') #保存结果到已存在的excel文档中
for file in files:
old_front = file.split('.')[0] #对文件进行重命名
old_ext = file.split('.')[-1]
old_name = old_front + '.' + old_ext
hour = old_front.split('-')[-1]
print('小时', hour)
new_name = old_front + '.' + 'xls'
#if file.split('.')[-1] == "txt":
# new_name = file.split('.')[0] + '.' + 'xls'
# df = open(file, 'r')
# lines = df.readlines()
# for line in lines:
# if line.strip() == '':
# continue
# if line.strip() == '"':
# continue
open_txt = open(file,'r',encoding='utf-8') #打开txt文档
next(open_txt)
workbook = xlwt.Workbook() #初始化xlwt
sheet_1 = workbook.add_sheet(old_front,cell_overwrite_ok = True) #对打开excel文档进行添加sheet_1
q =0
for line in open_txt: #txt文档的每一行都进行执行
line = open_txt.readline() #阅读每一行的内容
if line.strip() == '': #line.strip()是移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
continue
if line.strip() == '"':
continue
for h in range(len(line.split(' '))): #对特定的某行进行处理
if h == 0:
first_cell = line.split(' ')[0]
minute = first_cell.split(':')[0]
second = first_cell.split(':')[-1]
item = hour + ':' + minute + ':' + second
else:
item = line.split(' ')[h]
sheet_1.write(q,h,item) #定义的excel的shee_1中写入数据
q = q + 1
workbook.save(new_name) #对写入数据的sheet_1的excel进行保存
data_collect = pd.read_excel(new_name,index_col = 0,header = None) #使用pd打开文档
data_collect.to_excel(writer,sheet_name = hour,header = False) #一个excel同时保存多个sheet文档
writer.save() #对保存有多个sheet的excel进行保存
list.append(q)
print(list)
shutil.copy(new_name,'results') #将文件复制到“result”,前面是文件,后面是目录
shutil.move('many_sheets.xls', 'results') #move相当于剪切,remove相当于删除
sum = 0
for p in range(len(list)):
sum = sum + list[p]
print('all_总行数为:',sum)
print('已将将所有的数据转化为xls格式文件!')
print('list0',list[0])
filedir = os.path.dirname(sys.argv[0]) #获取脚本所在目录
os.chdir(filedir) #将脚本所在的目录设置为工作目录
wdir = os.getcwd() #返回当前目录
print('当前工作目录:{}\n'.format(wdir)) #打印当前工作目录
for parent, dirs, files in os.walk(wdir):
i = 0
parent_base = os.path.basename(parent) #返回path最后的文件名
print(parent_base)
if 'results' in parent_base:
print(parent)
os.chdir(parent)
u = 0
x = 0
sum_c = 0
i = 0
m = 0
workbook = xlwt.Workbook() #将xlwt进行初始化
sheet2 = workbook.add_sheet('all', cell_overwrite_ok=True) #添加文档sheet2
# workbook = xlwt.Workbook()
# sheet3 = workbook.add_sheet('diagram', cell_overwrite_ok=True)
for file in files :
df = pd.read_excel(file,header=0,index_col=None) #使用pd阅读文档
if i > (len(list) - 1):
break
long = list[i]
print(long)
for x in range(long-1) :
for y in range(12) :
item = df.ix[x,y] #阅读excel文件的特定的单元格
# print(item)
sheet2.write(m,y,str(item)) #将excel文件写入到同一个sheet2,这种写法不实用,可以使用矩阵代替
m = m + 1
i = i + 1
workbook.save('all_data.xls') #将多个sheet保存在同一个sheet中
data_collect = pd.read_excel('all_data.xls', index_col=0, header=None) #使用pd打开excel文档
data_collect.to_excel(writer, sheet_name='all_date', header=False) #将多个sheet保存在同一个excel文档中
writer.save() #对文档进行保存
print('all_data.xls 已经成功!')
ax = 0
ay = 0
d = -1
workbook = xlwt.Workbook() #对xlwt进行初始化
sheet3 = workbook.add_sheet('diagram', cell_overwrite_ok=True) #创建sheet3
nm = pd.read_excel('all_data.xls',header=0,index_col=None) #使用pd阅读文档
for ax in range(200):
if ax % 25 == 0:
d = d + 1
for ay in range(11):
cell = nm.ix[ax,ay] #阅读特定单元格的内容
sheet3.write(d,ay,str(cell)) #将阅读的内容写入到sheet3中
workbook.save('diagram.xls')
data_collect_2 = pd.read_excel('diagram.xls', index_col=0, header=None)
data_collect_2.to_excel(writer, sheet_name='diagram', header=False) #将多个sheet保存在同一个excel中
writer.save()
print('diagram.xls 已经成功!')
data_xls = pd.read_excel('diagram.xls',index_col=0) #使用pd阅读excel文件
data_xls.to_csv('diagram1.csv') #使用pd将excel文件保存成csv
with open('diagram.csv', 'w', newline="") as csvfile: # 打开header-1.csv,没有就创建一个,newline是保证写入之后不自动空格
writer_2 = csv.writer(csvfile) # 对文件进行写操作
# 先写入columns_name
writer_2.writerow(["time", "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V14"])
with open('diagram.csv','ab+') as f :
f.write(open('diagram1.csv','rb').read()) #对csv进行写操作
df = pd.read_csv('diagram.csv') #阅读csv文件
#使用matplotlib进行显示csv文档
figsize = 12, 12 # 图表的大小
plt.subplot(331) # subplot(221)创建2*2的图表1表示在第一个
plt.plot(df['time'], df['V1']) # plot(a,b)进行绘制曲线,a表示横坐标,b表示纵坐标,df['time']表示索引第一行为time的那一列
plt.xticks(rotation=90) # 创建的matplotlib表格旋转45°
plt.ylabel(u'电池板电压(V)', fontproperties='SimHei') # y轴的标签
plt.xlabel(u'时间', fontproperties='SimHei') # y轴的标签
plt.subplot(332)
plt.plot(df['time'], df['V2'])
plt.xticks(rotation=90)
plt.ylabel(u'电池板电流(A)', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.subplot(333)
plt.plot(df['time'], df['V3'])
plt.xticks(rotation=90)
plt.ylabel(u'蓄电池电压(V)', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.subplot(334)
plt.plot(df['time'], df['V4'])
plt.xticks(rotation=90)
plt.ylabel(u'蓄电池电流(A)', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.subplot(335)
plt.plot(df['time'], df['V5'])
plt.xticks(rotation=90)
plt.ylabel(u'环境温度(℃)', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.subplot(336)
plt.plot(df['time'], df['V7'], 'b', label=u"充电功率(W)")
plt.plot(df['time'], df['V8'], 'k', label=u"发电功率(W)")
plt.xticks(rotation=90)
plt.ylabel(u'充电/发电功率', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.subplot(337)
plt.plot(df['time'], df['V10'], 'b', label=u"累计充电(Ah)")
plt.plot(df['time'], df['V11'], 'k', label=u"累计放电(Ah)")
plt.xticks(rotation=90)
plt.ylabel(u'累计充电/放电', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
# myfont = matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/msyh.ttf') #处理matplotlib中中文显示的问题
# mpl.rcParams['axes.unicode_minus'] = False
# plt.grid(True) #显示网格线
plt.show()
plt.plot(df['time'], df['V1']) # plot(a,b)进行绘制曲线,a表示横坐标,b表示纵坐标,df['time']表示索引第一行为time的那一列
plt.xticks(rotation=90) # 创建的matplotlib表格旋转45°
plt.ylabel(u'电池板电压(V)', fontproperties='SimHei') # y轴的标签
plt.xlabel(u'时间', fontproperties='SimHei') # y轴的标签
plt.show()
plt.plot(df['time'], df['V2'])
plt.xticks(rotation=90)
plt.ylabel(u'电池板电流(A)', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.show()
plt.plot(df['time'], df['V3'])
plt.xticks(rotation=90)
plt.ylabel(u'蓄电池电压(V)', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.show()
plt.plot(df['time'], df['V4'])
plt.xticks(rotation=90)
plt.ylabel(u'蓄电池电流(A)', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.plot(df['time'], df['V5'])
plt.xticks(rotation=90)
plt.xlabel(u'时间', fontproperties='SimHei')
plt.ylabel(u'温度(℃)', fontproperties='SimHei')
plt.show()
plt.plot(df['time'], df['V7'], 'b', label=u"充电功率(W)")
plt.plot(df['time'], df['V8'], 'k', label=u"发电功率(W)")
plt.xticks(rotation=90)
plt.ylabel(u'充电/发电功率', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
plt.show()
plt.plot(df['time'], df['V10'], 'b', label=u"累计充电(Ah)")
plt.plot(df['time'], df['V11'], 'k', label=u"累计放电(Ah)")
plt.xticks(rotation=90)
plt.ylabel(u'累计充电/放电', fontproperties='SimHei')
plt.xlabel(u'时间', fontproperties='SimHei')
print('over!')
# # show data
# plt.scatter(x, y, c='magenta', s=50, alpha=0.5, label='train')
# plt.scatter(test_x, test_y, c='cyan', s=50, alpha=0.5, label='test')
# plt.legend(loc='upper left')
# plt.ylim((-2.5, 2.5))
# plt.show()