写在前面
对于一个做防腐蚀涂层的化学材料人来说,
在做电化学实验的时候,我们会获得很多的电化学稳态阻抗谱(EIS),其中包含频率、实部、虚部,然后需要将这些EIS的数据进行平均值处理,接着模量等于实部和虚部的平方和再开根号,还有相位角是虚部除以实部的反正切函数的弧度转角度值,然后使用origin作图,作图后还要读取最低频率对应的模量值和负45°对应频率值来反应涂层的防腐蚀性能和抗阴极剥离能力。
在没有学习python用于办公自动化之前,都是采用漫长的复制黏贴,数据分列还有excel的多次函数才能实现,非常重复浪费时间,然后经过学习,我将这一个过程进行了自动化处理,使用glob对文件夹进行遍历,把数据整理好到excel的同时使用了matplotlib来进行数据可视化,做到了一键出图。
这个代码在Jupyter Notebook里面实现会比pycharm方便,因为只要在python3的文件的同个目录建立2个文件夹“Tafel”,丢进去即可,但是前提要先将每个电化学的txt文本数据进行统一的命名处理,类如EIS-blank WEP-30day-4.txt((EIS测试)(-)(样品名字)(-)(腐蚀时间)(-)(第几次数据)(.)(.)(txt))。
本文用的是CHI-660E电化学工作站得到的数据,如果不是,请研究一下如何用pandas.read_csv来读取你的测试的数据,并且将表头改为[‘0’, ‘1’, ‘2’],才可以套用这个代码。
本文仅作为记录自己的学习代码后结合自己科研的分享,转载请说明出处,欢迎评论和讨论。
正文开始
EIS-汇总-平均-1个表单
汇总EIS
#导入数据表,对数据包进行命名
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import xlwt
import glob
import xlrd
#关键参数
#存储文件夹为和本测试文件相同的,名叫EIS的文件夹
datadir= r".\EIS"
#*号为该文件夹下所有文件
datadir_all = r".\EIS\*.txt"
#excel的保存名字
save_to_excel_1 = savename = r".\EIS数据汇总.xls"
#找到这个文件夹的所有txt文件
l1 = glob.glob(datadir_all)
# print(l1)
#将文件名进行必要的取舍
fname_list = []
for item in l1:
fname_list.append(item.split('\\')[-1])
# print(fname_list)
#'EIS-0.2fMX_WEP-10day-0.txt'
characterizaitonlist =[] #测试手段,EIS
samplenamelist = [] #样品名字
immersionlist=[] #浸泡时间
repeatlist=[] #重复相同样品
for fnam in fname_list:
cut_name = fnam.split('-')
characterizaitonlist.append(cut_name[0])
samplenamelist.append(cut_name[1])
immersionlist.append(cut_name[2])
repeatlist.append(cut_name[3].split('.')[0])
print(samplenamelist)
# print(immersionlist)
#这里要用样品名字和浸泡天数作一个新的集合
#因为EIS的作图会涉及到天数
new_samplenamelist =[]
for i in range(len(samplenamelist)):
item_name = samplenamelist[i] + immersionlist[i]
new_samplenamelist.append(item_name)
print(new_samplenamelist)
#将txt的数据进行读取
h = 0
book = xlwt.Workbook(encoding="utf-8", style_compression=0)
for fname in fname_list:
fnamepath = datadir + r'\{0}'.format(fname) # 给文件增加路径
f = pd.read_csv(fnamepath,header=None,sep='\t', names=['0', '1', '2'])
# print(f)
# Freq/Hz, Z'/ohm, Z"/ohm
# 令其为names=['0','1','2']方便检索
# 这个是表头
# [73 rows x 3 columns]
# print(fname + '有%d行' % (len(f.loc[:, '1'])))
# print(fname + '有%d列' % (len(f.loc[0, :])))
name = characterizaitonlist[h]+samplenamelist[h]+immersionlist[h]+repeatlist[h]
# 创建workbook,style_compression:表示是否压缩,不常用。encoding="utf-8",可以输入中文
sheet = book.add_sheet(name, cell_overwrite_ok=True)
#写数据
for i in range(len(f.loc[0, :])):
if i == 2:
# -Z"/ohm
column = f.loc[:, '%d' % i] * -1
else:
column = f.loc[:, '%d' % i]
for j in range(len(column)):
sheet.write(j, i, column[j])
h = h + 1
#保存excel
book.save(savename) # 保存名字或者路径,要给一个“”的字符串
#提示
print("汇总成功","从txt原始数据整理及保存到excel表格,以文件名作为excel表头")
print("-"*20)
平均EIS的前三列数据
import xlrd
import re
import xlwt
#要读取的excel表格为上面做的汇总表
savename = save_to_excel_1 = r".\EIS数据汇总.xls"
#打开表格
book = xlrd.open_workbook(savename)
#读取所有表单的名字
sheet_list = book.sheet_names()
print('表单列表')
print(sheet_list)
#计算表格的个数
number = len(sheet_list)
print('总共有多少个表单')
print(number)
#不重复的样品的列表,也就是最终要做的图线
print('不重复的样品的列表,也就是最终要做的图线')
#导入上一步的samplenamelist并且去重,得到样品数量
samples = list(set(new_samplenamelist))
print(samples)
#设置新的excel表格
save_to_excel_2 = save_newname = r".\EIS的所有单元格平均后汇总.xls"
#打开表格
newbook = xlwt.Workbook(encoding="utf-8", style_compression=0)
for sample in samples: #5个样品
print(sample) # cd= '0.2MX_WEP' #举例
lists = [] #开一个空的列表
#找到所有的这个样品的数据,形成一个新的列表
findBd = re.compile(r'.*(%s).*'%sample) #正则表达式
for item in sheet_list:
ls = re.match(findBd,item)
if ls == None:
continue
text = ls.string
# print(text)
lists.append