Python文本处理小案例

这篇文章主要是在某次帮学长做一个文本处理时的总结,需求是把从服务器导出的数据做简单处理,取出关键的数据整理后画图 ,感觉需求很简单,但是在实现的过程中还是遇到了不少问题。

 

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开头的数据写入文本中,最后读取出数据并画图。


1.读取文件合并'!'行

代码如下:

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进行转换,否则将替换失败。

 

2.正则表达式匹配

代码如下:

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,只匹配一个。

  • findall():在string中查找所有 匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。

  • finditer():在string中查找所有 匹配成功的字符串, 返回iterator,每个item是一个Match object。

这里之所以选择match()是因为特征刚好在行开头,其实严谨一点的话应该选择search()或者findall(),这样的话匹配结果才会更严谨。

3.保存文件

代码如下:

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文件。写入文件后关闭文件。

 

第一次写博客,这里主要是做一下一些小知识点的总结,有许多做的不好的地方,如果有错误的地方望不吝指教。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值