这篇文章主要是在某次帮学长做一个文本处理时的总结,需求是把从服务器导出的数据做简单处理,取出关键的数据整理后画图 ,感觉需求很简单,但是在实现的过程中还是遇到了不少问题。
rawdata大致如下
********* S_Message Start [DS03] ********* &,S,T,TIDL,0002PP2SY00LAS17112! !31158 &,S,T,TESTER,D20110 &,S,T,MECHA,0002PP2SY00LAS &,X,S,STP13:0,3652 &,X,D,TDEX_TEMP_RHT0,5 &,X,H,TD_Z00_RHT0,323,31! !3,0,0,0,0,0,0 &,X,H,TD_Z08_RHT0,348,33! !5,0,0,0,0,0,0 &,X,H,TD_Z11_RHT0,348,33! !3,0,0,0,0,0,0 &,X,H,TD_Z1A_RHT0,330,31! !5,0,0,0,0,0,0 &,X,H,TD_Z24_RHT0,304,28! !1,0,0,0,0,0,0 &,X,H,TD_Z25_RHT0,319,31! !1,0,0,0,0,0,0 &,X,S,STP14:0,4043 &,X,S,STP15:0,4043 &,X,S,STP16:0,4043 &,X,S,STP17:0,4043 &,X,D,TDEX_TEMP_PHT0,5
处理这些数据首先要把“!”结尾的数据和下一行的“!”开头的数据连接起来,因为这两行本是一行数据的,但是记录在服务器的时候分为了两行,所以第一步就是先把两行合一起同时去掉“!”号。然后整理出以&,X,H,TD_Z开头的数据写入文本中,最后读取出数据并画图。
代码如下:
infile = r'C:\\Users\\26035\\Desktop\\新建文本文档 (2).txt'
infopen = open(infile, 'r+',encoding="utf-8")
lines = infopen.readlines() #读取整个文件以list形式返回
a = ''#空字符(中间不加空格)
for line in lines:
a += line
str=a
print(str.replace('!\n!', '')) #去掉!\n!并输出
这里比较值得注意的是readlines()和replace()的使用。
其中读取文件的方式有三种,分别是read()、readline()、readlines()三种,其特性如下:
read():read 是读取整个文件,把整个文件的内容赋值给一个字符串。
readline():每次读取一行,把这一行赋值给一个字符串,返回。
readlines():把文件都放到内存中(如果文件比内存大,则用不了;但这个方法速率很高);之后把整个文件作为一个list返回。
这里合并两行并且去除'!',我选的是replace(),之所以用的是replace()而不是strip()是因为我觉得strip()有点用不明白,主要是在去除"!"的同时还要去除"\n",在实现的时候老是不成功所以换了replace()。
replace()
str.replace(old, new[, max])
参数含义
old -- 将被替换的子字符串
new -- 新字符串,用于替换old子字符串。
max -- 可选字符串, 替换不超过 max 次
在这里用replace()的时候得注意,因为readlines返回是列表的形式,但replace()的参数只能是字符串的形式,所以需要用str进行转换,否则将替换失败。
代码如下:
lines = newfile.readlines()
pattern= re.compile(r'&,X,H,TD_Z') #创建pattern为&,X,H,TD_Z
for line in lines:
str =line
match= re.match(pattern, str, flags=0) #在文档内匹配pattern
if match:
newfile.write(line) #写入整理后的数据
在抽取出关键数据这一步当然是用正则表达式匹配啦。方便好用功能强大。
re匹配字符串的方法有四种,分别是match、search、findall、finditer。其特性如下:
match():匹配string 开头,成功返回Match object, 失败返回None,只匹配一个。
search():在string中进行搜索,成功返回Match object, 失败返回None, 只匹配一个。
findall():在string中查找所有 匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。
finditer():在string中查找所有 匹配成功的字符串, 返回iterator,每个item是一个Match object。
这里之所以选择match()是因为特征刚好在行开头,其实严谨一点的话应该选择search()或者findall(),这样的话匹配结果才会更严谨。
代码如下:
b = os.getcwd() + '\\test_txt\\' #获取当前路径,并添加test_txt文件夹
if not os.path.exists(b): #判断当前路径是否存在
os.makedirs(b) #不存在则创建新的文件夹
new=open(b +'new.txt', "w") #创建TXT文件
new.write(str.replace('!\n!', '')) #替换!\n!后写入新文件夹
new.close()
这部分代码主要是保存整理过后的文件,这里用b = os.getcwd()获取当前源码所在位置的路径,之后加一个名为text_txt的文件夹。判断是否存在这个路径,如果没有则创建b路径。同时创建一个新的TXT文件。写入文件后关闭文件。
第一次写博客,这里主要是做一下一些小知识点的总结,有许多做的不好的地方,如果有错误的地方望不吝指教。