【python学习】批量从含有多列数据的txt文件中提取某个数据,并存入csv文件

news2024/11/16 3:40:25

批量从含有多列数据的txt文件中提取某个数据,并存入csv文件

  • 任务需求与解读
  • 代码实现
    • 导入相关库
    • 提取txt文件的三列数据存为列表
    • 按条件提取某个数据存入字典
    • 将字典写入csv文件

任务需求与解读

昨天收到一个需求,希望能将电化学工作站的数据文件(.bin后缀)转为txt文件,并从txt文件中提取某个电位对应的电流,然后再找这个电流的一半所对应的电位,将以上这些数据提取出来,存入csv文件中。任务图示见下,
在这里插入图片描述
这个任务实际主要分两步

  • 第一,将bin文件转为txt文件;
  • 第二,读入txt文件,提取数据,存入csv文件。

由于不清楚电化学工作站是以什么样的编码方式将数据存入二进制bin文件使用python很难解码尝试了多种模块也没有成功 。因此对于第一步,只能选择手动通过电化学工作站专有的软件,将bin文件转为txt文件。最后任务只需要实现从txt文件中提取数据,并存入csv文件。

代码实现

实现从txt文件中提取某个电位对应的电流,然后再找这个电流的一半所对应的电位,将以上这些数据提取出来,存入csv文件中。

【代码思路设计】

  1. 读入txt文件,定位到数据部分;
  2. 将数据提取存储到列表中;
  3. 根据条件定位到列表元素,提取所需数值,存入列表;
  4. 使用for循环遍历每一份txt文件,实现步骤1-3,最后将所有提取的数据写入csv文件;

导入相关库

import os
import csv
import copy
import datetime
import numpy as np

提取txt文件的三列数据存为列表

在这里插入图片描述
该函数用于实现提取txt文件的三列数据,存储在列表中
file_path:txt文件路径

【实现步骤】

  1. 首先按行读入txt文件,去掉每行的前后空格,存成新列表;
  2. 定位到txt文件内数据的前一行,即’Segment 1:'处;
  3. 将每行数据根据逗号’,'分离,分别存入三个空列表; 即可得到分别存储了txt文件三列数据的三个列表。
def get_alldata(file_path):
    '''
    该函数用于实现提取txt文件的三列数据,存储在列表中
    file_path:txt文件路径
    实现步骤:
    首先按行读入txt文件,去掉每行的前后空格,存成新列表;
    定位到txt文件内数据的前一行,即'Segment 1:'处;
    将每行数据根据逗号','分离,分别存入三个空列表;
    即可得到分别存储了txt文件三列数据的三个列表。
    '''
    data_L=[]
    with open(file_path,'r') as f:#打开txt文件
        lines=f.readlines()#按行读取文件,并按行存储为列表
        new_lines=[]#建立新列表,存储去掉前后空格后的元素
        for line in lines:#遍历存储了文件信息的列表
            line = line.strip()#去掉每个元素中的前后空格
            new_lines.append(line)#存储去掉前后空格后的元素
        start_site=new_lines.index('Segment 1:')#定位到数据前的位置
        for i in range(start_site+1,len(new_lines),1):
            xyz=new_lines[i].split(',')#对列表元素根据逗号','分离为新列表
            xyz_cp=copy.deepcopy(xyz)#对列表进行深复制
            data_L.append(np.array(xyz_cp).astype('float64'))#将数据存入列表
        potential_L=[i[0] for i in data_L]#txt第一列数据
        diskcurrent_L=[i[1] for i in data_L]#txt第二列数据
        ringcurrent_L=[i[2] for i in data_L]#txt第三列数据
    return potential_L,diskcurrent_L,ringcurrent_L

【输出示例】

file_path=r'D:\desks\test.txt'
potential_L,diskcurrent_L,ringcurrent_L=get_alldata(file_path)
print(potential_L[0],diskcurrent_L[0],ringcurrent_L[0])
0.2 3.772e-05 2.617e-06

按条件提取某个数据存入字典

【两个条件】
第一,已知第一列数据想要的数值,提取相同行数对应的第二、第三列数据;
第二,已知第二列数据想要数值的一半,找到第二列相近数值,提取相同行数对应的第一、第三列数据;
对于第一个条件,可以使用列表索引实现定位;对于第二个条件,使用已知数值与第二列所有数据作差,找出差值绝对值最小的,就是所需要找的第二列数值,然后使用列表索引实现其他两列数据的定位。
【代码实现】
该函数用于实现提取指定电压下的电流,并寻找半电流下的电位。
txt_folderdir:txt文件夹所在路劲
txt_foldername:txt文件夹名
【实现步骤】

  1. 首先定义好存储了txt文件夹的路径,将路径下的txt文件名存为列表,方便后面进行一份份遍历txt文件;
  2. 遍历txt文件,获取txt文件中的三列数据; 根据规定的电位,找出对应的盘电流、环电流,存入字典,存储格式是{txt文件名:数据};
  3. 接着计算盘电流的一半,使用该数值逐一与盘电流中的所有数值做差,找出差值的绝对值最小所对应的盘电流,这个盘电流就是我们需要找的一半;
  4. 根据找到的盘电流所在位置,找到对应的电压与环电流,分别存入字典;
  5. 以上便完成了数据的提取

def get_specifieddata(txt_folderdir,txt_foldername,potential):
    '''
    该函数用于实现提取指定电压下的电流,并寻找半电流下的电位
    txt_folderdir:txt文件夹所在路劲
    txt_foldername:txt文件夹名
    实现步骤:
    首先定义好存储了txt文件夹的路径,将路径下的txt文件名存为列表,方便后面进行一份份遍历txt文件;
    遍历txt文件,获取txt文件中的三列数据;
    根据规定的电位,找出对应的盘电流、环电流,存入字典,存储格式是{txt文件名:数据};
    接着计算盘电流的一半,使用该数值逐一与盘电流中的所有数值做差,找出差值的绝对值最小所对应的盘电流,这个盘电流就是我们需要找的一半;
    根据找到的盘电流所在位置,找到对应的电压与环电流,分别存入字典;
    以上便完成了数据的提取。
    '''
    txt_folderpath=os.path.join(txt_folderdir,txt_foldername)#txt文件所在路径
    txt_files=os.listdir(txt_folderpath)#遍历txt文件夹中的所有文件,将文件名存储在列表中
    #建立字典存储数据,存储方式均为{文件:数据}
    potential_dict={}#存储{文件:电位}
    half_potential_dict={}#存储{文件:半电位}
    diskcurrent_dict={}#存储{文件:电位对应的盘电流}
    half_diskcurrent_dict={}#存储{文件:半电位对应的盘电流}
    ringcurrent_dict={}#存储{文件:电位对应的环电流}
    half_ringcurrent_dict={}#存储{文件:半电位对应的盘电流}
    for file in txt_files:
        file_path = os.path.join(txt_folderpath,file)#txt文件所在路径
        potential_L,diskcurrent_L,ringcurrent_L=get_alldata(file_path=file_path)#txt文件中的三列数据
        #首先提取某电位对应的电流
        potential_index=potential_L.index(potential)#定位到电压为-0.5的位置
        diskcurrent=diskcurrent_L[potential_index]
        ringcurrent=ringcurrent_L[potential_index]
        #print(diskcurrent,ringcurrent)
        potential_dict[file[:-4]]=potential
        diskcurrent_dict[file[:-4]]=diskcurrent
        ringcurrent_dict[file[:-4]]=ringcurrent
        #print(potential_dict,diskcurrent_dict,ringcurrent_dict)
        #下面提取半电流对应位置
        half_current_theory=diskcurrent/2
        diff_L=[]
        for current in diskcurrent_L:
            diff=abs(half_current_theory-current)#计算差值的绝对值
            diff_cp=copy.deepcopy(diff)
            diff_L.append(diff_cp)
        half_current_index=diff_L.index(min(diff_L))#定位到绝对值最小的位置
        half_current_calc=diskcurrent_L[half_current_index]#找到对应电流
        #print(file,half_current_index,half_current_calc)
        #根据找到的位置,分别找出对应的电位与环电流
        half_potential_dict[file[:-4]]=potential_L[half_current_index]
        half_diskcurrent_dict[file[:-4]]=diskcurrent_L[half_current_index]
        half_ringcurrent_dict[file[:-4]]=ringcurrent_L[half_current_index]
        #print(half_potential_dict,half_diskcurrent_dict,half_ringcurrent_dict)
    return potential_dict,half_potential_dict,diskcurrent_dict,half_diskcurrent_dict,ringcurrent_dict,half_ringcurrent_dict

将字典写入csv文件

将上面提取的数据存入csv文件

def write_data_tocsv(txt_folderdir,txt_foldername,potential):
    '''
    该函数实现将提取的数据存入csv文件
    
    '''
    save_csvdir=os.path.join(txt_folderdir,txt_foldername+'_data_to_csv')
    if not os.path.exists(save_csvdir):
        os.makedirs(save_csvdir) 
    potential_dict,half_potential_dict,diskcurrent_dict,half_diskcurrent_dict,ringcurrent_dict,half_ringcurrent_dict=get_specifieddata(txt_folderdir,txt_foldername,potential)
    #将前面存储了文件名及相应数据的字典按列存储在csv文件中
    mkfile_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d%H%M%S')#这里是运行时对应的日期
    rows = zip(potential_dict.keys(),potential_dict.values(),diskcurrent_dict.values(),ringcurrent_dict.values(),half_potential_dict.values(),half_diskcurrent_dict.values(),half_ringcurrent_dict.values())
    with open(os.path.join(save_csvdir,'data_to_csv_'+mkfile_time+'.csv'), "w", newline='') as f:
        writer = csv.writer(f)
        # 标题行写入
        header = ['txt文件名','电压', '盘电流','环电流','半盘电流对应的电压','半盘电流','半盘电流对应的环电流']
        # 数据写入
        csvrow1 = []
        csvrow2 = []
        csvrow3 = []
        csvrow4 = []
        csvrow5 = []
        csvrow6 = []
        csvrow7 = []
        csvrow1.extend('txt文件名')
        csvrow2.extend('电压')
        csvrow3.extend('盘电流')
        csvrow4.extend('环电流')
        csvrow5.extend('半盘电流对应的电压')
        csvrow6.extend('半盘电流')
        csvrow7.extend('半盘电流对应的环电流')
        writer.writerow(header)
        writer.writerows(rows)

【代码运行】

txt_folderdir=r'D:\desk\bin'
txt_foldername='txt_file'
potential=-0.5
write_data_tocsv(txt_folderdir,txt_foldername,potential)

【csv文件输出】
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

欧文数据建模师 erwin Data Modeler Crack

欧文数据建模师 erwin Data Modeler 是一款屡获殊荣的数据建模工具, 用于查找、可视化、设计、部署和标准化高质量的企业数据资产。从任何地方发现和记录任何数据,以在大规模数据集成、主数据管理、元数据管理、大数据、商业智能和分析计划中实现一致性、…

kubernetes--安全沙箱运行容器gVisor

gVisor介绍 所知,容器的应用程序可以直接访问Linux内核的系统调用,容器在安全隔离上还是比较弱,虽然内核在不断的增强自身的安全特性,但由于内核自身代码极端复杂,CVE漏洞层出不穷。 所以要想减少这方面安全风险&#…

MATLAB | 这些花里胡哨的热图怎么画

好早之前写过一个绘制相关系数矩阵的代码,但是会自动求相关系数,而且画出来的热图只能是方形,这里写一款允许nan值出现,任意形状的热图绘制代码,绘制效果如下: 如遇到bug请后台提出,并去gitee下…

Spring Boot+Vue前后端分离项目练习02之网盘项目利用token进行登陆验证

1.添加依赖 首先需要添加jwt对应的依赖。 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>2.添加配置 JWT由三部分构成&#xff0c;分别是 header, pa…

详解数据结构中的顺序表的手动实现,顺序表功能接口【数据结构】

文章目录线性表顺序表接口实现尾插尾删头插头删指定位置插入指定位置删除练习线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列…

Freemarker动态模板渲染flyingsaucer将html转PDF(多页固定头尾)

目录一、序言二、CSS样式控制打印模板三、代码示例1、pom.xml2、application.yml3、PdfGenerationController4、Freemarker模板内容四、展示效果一、序言 一般正常来说&#xff0c;生成PDF的操作都是通过将HTML转成PDF&#xff0c;HTML动态渲染可以借助模板引擎&#xff0c;如…

从外行到外包,从手工测试到知名互联大厂测开,我经历了什么...

本人本科就读于某普通一本院校&#xff08;非985&#xff0c;211&#xff09;&#xff0c;经管类专业&#xff0c;从大四实习到15年毕业后前两年一直在从事自己专业相关的工作。17年时决定想要转业从事计算机相关领域工作&#xff0c;在17年9月的一个机遇大跨度转行到测试行业&…

vue子组件监听父组件数据变化并作出改变(亲测有效)

vue子组件监听父组件数据变化并作出改变&#xff08;亲测有效&#xff09; 1. 问题 1.1 封装组件时经常会遇到子组件需要根据父组件数据变化并执行对应的操作逻辑 1.2 监听方法中加了deep、immediate 等参数监听数组/对象还是没有生效 1.3 类型table组件需要根据父组件数据…

Java多线程学习——线程的创建、Thread类以及多线程状态

文章目录学习目标一、认识线程1、线程是什么&#xff1f;2、为什么要有线程3、进程和线程的区别二、Thread类以及常见方法1.创建线程的几种方式2、Thread类属性及方法2.1、Thread的常见构造方法2.2、Thread的常见属性3、线程的中断-interrupt()中断一个线程&#xff1a;4、等待…

前端面试题 —— 浏览器原理(一)

目录 一、进程与线程的概念 二、如何实现浏览器内多个标签页之间的通信? 三、浏览器资源缓存的位置有哪些&#xff1f; 四、对浏览器内核的理解 五、常见的浏览器内核比较 六、浏览器的主要组成部分 七、渲染过程中遇到 JS 文件如何处理&#xff1f; 八、什么情况会阻塞…

【C语言】动态内存管理

我们之前开辟的空间&#xff0c;大小固定&#xff0c;且在申明数组的时候&#xff0c;必须指定数组的长度。但是有时候我们需要的空间大小在程序运行的时候才知道&#xff0c;这就得动态内存开辟出马了。 目录 1.malloc和free 2.calloc 3.realloc 4.常见动态内存错误 5.经…

TCP 握手过程 三次 四次

蛋老师视频 SYN 同步 ACK 确认 FIN 结束 核心机制是确定哪些请求或响应需要丢弃 SYN、ACK、FIN 通过 1/0 设置开启/关闭 开启SYN后&#xff0c;报文中会随机生成 Sequence序号 用于校验 &#xff08;应用可能发起多个会话&#xff0c;可以区分&#xff09; 服务器的同步序…

2023版D盾防火墙v2.1.7.2,主动防御保护,以内外保护的方式 防止网站和服务器给入侵。限制了常见的入侵方法,让服务器更安全

v2.1.7.2 (20230107) 2023-1-7 1.修正PHP一处文件检测的bug。 2.修正某些情况下无法文件加白问题。 v2.1.7.2 2022-10-13 1.针对aspx的样本加入了新的识别。 2.针对上传 doc格式文件提示“上传格式不符” 的修正。 3.工具“HTTPS安全”,把 TLS 1.1 和 TLS 1.0 设置为默认不选中…

杰理AD16N简介

一、概述&#xff1a; AD16N是杰理新出的一个MP3解码芯片&#xff0c;是高集成度的 32 位通用音频 SOC&#xff0c; 集成 40KByte SRAM&#xff0c; 时钟源可选内部 RC 或外部12MHz 晶振&#xff0c; 最高主频可达 160MHz&#xff1b; 主要是替代AC109N系列和AC608N、AC104N系列…

Python爬虫书写时遇到的问题汇总

文章目录python的xpath插件需要的库下载出现问题懒加载python 爬取图片,网址都正确但是下不下来的原因:爬取下来的文字包含Windows不能识别的特殊字符selenium的find_element_by_id()出现的问题爬虫信息写入mysql时的1045号错误python的xpath插件需要的库下载出现问题 ERROR: C…

MySQL特殊语法insert into ... on duplicate key update ...

一、前言 在日常开发中&#xff0c;经常会遇到这样的需求&#xff1a;查看某条记录是否存在&#xff0c;不存在的话创建一条新记录&#xff0c;存在的话更新某些字段。 比如下列伪代码&#xff1a; $row mysql_query($result);if($row){mysql_execute(update ...);}else{my…

MongoDB复习

目录 1.docker安装 2.mondo概念解析 3.数据库操作 4.基本数据类型 5. 适合使用场景 6.对集合操作 7.常用操作 1.docker安装 docker pull mongo:latest docker run -d --restartalways -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo docker exec -it m…

【SpringBoot高级篇】SpringBoot集成Sharding-JDBC分库分表

【SpringBoot高级篇】SpringBoot集成Sharding-JDBC分库分表Apache ShardingSphere分库分表分库分表的方式垂直切分垂直分表垂直分库水平切分水平分库水平分表分库分表带来的问题分库分表中间件Sharding-JDBCsharding-jdbc实现水平分表sharding-jdbc实现水平分库sharding-jdbc实…

数据结构-考研难点代码突破(查找算法 - 散列表(哈希表)C++实现除留余数法拉链法哈希)

文章目录1. 哈希表与解决哈希冲突的方法2. C实现除留余数法拉链法哈希1. 哈希表与解决哈希冲突的方法 散列表(Hash Table)&#xff0c;又称哈希表。是一种数据结构。 特点&#xff1a;数据元素的关键字与其存储地址直接相关。 关键字通过散列函数&#xff08;哈希函数&#…

Vue3.0文档整理:2、创建单页面应用程序

2.1&#xff1a;创建步骤 2.1.1&#xff1a;vue-cli 安装并执行create-vue:npm init vuelatest 它是Vue官方的项目脚手架工具 选择项目功能 除了第一项的项目名字外&#xff0c;其他可以暂时默认回撤或者选择No 切换到项目目录:cd <your-project-name> 安装项目依赖&…