1、 问题描述
笔者所使用的的txt文件较为复杂,但是几乎所有的类似问题都可从中推演出来。笔者的txt文件有效信息格式如下
====Start data collection label1====
xxxxxxx #表示未知的中英文字符串
xxx acc 0.1 0.2 0.3 xxx
xxx gyro 0.4 0.5 0.6
==== End data clooection xxx====
xxxxxxx
====Start data collection label2====
xxxxxxx #表示未知的中英文字符串
xxx acc 0.11 0.21 0.31 xxx
xxx gyro 0.41 0.51 0.61
==== End data clooection xxx====
xxxxxxx
假设label1对应的标签是1,我们期望得到的csv文件是:
0.1 0.2 0.3 0.4 0.5 0.6 1
0.11 0.21 0.31 0.41 0.51 0.61 2
2、所需第三方库
import os
import numpy as np
import traceback
3、任务分解
3.1 将所有的txt文件放到一个文件夹中,进行批量读取
path='./dataset'
files=os.listdir(path)
for file in files:
if os.path.splitext(file)[-1]='.txt'
file=path+'\\'+file
try:
tocsv_file(flie)
except Exception as e:
print(traceback.format_exc())
3.2将类别进行分类统计标签
首先定义一个字典,用于统计标签
dicts={
'label1':'1',
'label2':'2',
'label3':'3',
'label4':'4',
}
3.3用一个列表保存txt文件的每一行
datas=[]
with open(file,"r",encoding='unicode-escape') as f:
for line in f.readlines():
line=line.strip('\n')
datas.append(line)
3.4 统计每个label出现的次数
注意,这里还需要一个二维列表,用于分别保存start data collection 和end data collection 之间的数据,命名为traindata
i=-1
traindata=[[] for _ in range(100)]
flag=False
labels=[]
for data in datas:
if 'Start data collection' in data:
flag=True
i=i+1
label=data.split(' ')[4]
labels.append(dicts[label])
if flag==True:
traindata[i].append(data)
if 'End data collection' in data:
falg=False
labels=np.array(labels)
3.5 开始有效数据提取
在提取数据之前,我们先定义一个函数,count_list ,用于判断一个二维列表的非空元素的长度
def count_list(nums):
count = 0
for i in range(len(nums)):
if nums[i] != []:
count += 1
return count
res1 = [[] for _ in range(count_list(traindata))]
res2 = [[] for _ in range(count_list(traindata))]
res3 = [[] for _ in range(count_list(traindata))]
for j in range(count_list(traindata)):
strdatas = traindata[j]
for strdata in strdatas:
if 'acc' in strdata:
valid_data=strdata.split(' ')[3]+' '+strdata.split(' ')[4]+' 'strdata.split(' ')[5]
res1[j].append(valid_data)
if 'gyro' in strdata:
valid_data=strdata.split(' ')[3]+' '+strdata.split(' ')[4]+' 'strdata.split(' ')[5]
res2[j].append(valid_data)
for ii in range(len(res2)):
for jj in range(min(len(res1[ii]), len(res2[ii]))):
res3[ii].append(res2[ii][jj] + ',' + res1[ii][jj] + ',' + labels[ii])
3.5 有效数据保存
savepath=''
subject=''
for iii in range(len(res3))
res4=[]
listdatas=res3[iii]
for listdata in listdatas:
temp=listdata.split(' ')
res4.append(tmep)
res5=np.array(res4)
res5=res5.astype(float)
np.savetxt('{}{}{}'.format(),res5,delimiter=' ',fmt=)
4.整体代码
|