python如何从txt文件中解析出有效的数据

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) #tocsv_file为用于处理txt的主要程序
	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) #将每一行的字符串都添加到datas列表中

3.4 统计每个label出现的次数

注意,这里还需要一个二维列表,用于分别保存start data collectionend data collection之间的数据,命名为traindata

i=-1 #表示traindata的索引,初始化为-1
traindata=[[] for _ in range(100)]
flag=False #表示进入 start data collection的标志
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
# 先定义两个二维列表,用于储存acc和gyro数据
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)
#这里使用2重for循环。len(res2)=len(res1)
#担心会出现说偶尔某一次只有acc,没有gyro的数据,因此,做最小值判断,防止报错
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.整体代码

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值