程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2022-04(6)

2022-05(6)

python读取.txt、.dat等文件,将其中特定内容存到其他文件

发布于2023-02-04 12:42     阅读(987)     评论(0)     点赞(14)     收藏(5)


我想要用的数据存在一个.dat文件中,但是这个文件中除了我想要的数据还有很多其他杂乱的内容,所以需要有一个寻找我想要内容的过程,见下图,我想要的是图中标亮部分及以后的数据;我需要将这些数据按顺序读出,并将其转换成数值类型,然后再按顺序写入csv文件。首先分析一下思路,这个.dat文件可以直接用python打开读取内容,如下图所示,所以不用另外进行格式转换

可以通过关键字来查找到我需要的数据的位置,比如我这个文件中有一行表示单位的字符(红框),并且在该文件中独一无二,就可以作为关键字

找到我需要的数据的位置后,需要把数据读取出来,可以看到文件中两个数据间是用tab或者space隔开,可以用这个来进行数据的识别

两个tab间就是一个完整的数据,因为是.dat格式,里面的内容都是str格式,相当于每一个数字和每一个空格都是一个字符(后面会进行验证),以"        100019.5        "为例,检测到tab,将后面的‘1’存入一个变量a中,‘0’、‘0’....‘5’依a中,因为在python中字符串可以直接相加,所以直接可以:a+'0'这样来相加;

这样把数据完整的取出来后,这时的数据还是str格式的,所以需要先将其转换成float格式,再存入到csv文件中;

这就是一个完整的过程,下面来看具体实现。

  1. fp=open('171017-1656_#23.DTA')
  2. lines = fp.readlines()
  3. fp.close()
  4. for x in lines:
  5. print(x)

 左图是函数输出,右图是打开的.dat,可以看出内容没有错乱,可以正常读取。

 接下来找关键字的位置来找到我需要的数据,原文件比较大,为方便实验展示,我新建了一个小的456.dat文件。

先用readlines函数读取全部内容到内存,并输出一下,看看是什么格式,如果这一步遇到编码格式错误的问题,请看(47条消息) UnicodeDecodeError: ‘‘ codec can‘t decode byte 0xb0 in position : invalid start byte,批量读取不同编码文件的解决方法_一起躺躺躺的博客-CSDN博客

  1. fp=open('456.dat')
  2. lines = fp.readlines()
  3. print(lines)
  4. fp.close()

和文件中内容对应看,可以看出再lines中的想要作为关键字的内容,复制出来作为关键字,并且我需要的是关键字后面的内容,可以设置一个状态变量,找到之前为0,找到后为1

  1. t = 0
  2. for line in lines:
  3. if t == 1:
  4. print(line)
  5. print(len(line))
  6. else:
  7. if line == "\t#\ts\tHz\tohm\tohm\t\tV\tohm\t?A\t\tV\t\t#\n":
  8. t = 1

并且可以看到每一行的长度,明显是一个数字一个字符,可以输出看一下,这个时候的line是最后一行

  1. for x in line:
  2. print(x)

 

对照可以看出每一个字符都是单独存储,没有字符串,并且有tab和空格的存在,下一步就是准确读出里面的数据

为方便实验,我们先对一行数据进行处理。每一行数据都是11个,很规整,建立一个长度为11的列表,并对其进行初始化,相邻的两个tab或者space间的数据是一个完整的数据,可以设置两个状态变量,t1代表前一个字符的内容,t2代表当前字符内容,0表示为str,1表示为space或者tab

  1. a = [i for i in range(11)]
  2. t1 = 1 #0表示为str,1表示为空
  3. t2 = 1
  4. i = 0
  5. for x in line:
  6. if t1 == 0 and t2 == 1: #01 str-空 我这个数据文件当中每一行开头是tab,所以我选01
  7. #状态的时候i+1,根据实际情况来改变
  8. i += 1
  9. t1 = t2
  10. if x !=' ' and x != ' ':
  11. t2 = 0
  12. else: t2 = 1
  13. if t1 ==1 and t2 == 0 : #10 空-str
  14. a[i] = x
  15. else :
  16. if t1 ==0 and t2 == 0: #00 str-str
  17. a[i] += x
  18. print(a)

 和文件对照,没有任何错误,加上关键字的寻找,看在全部数据上是否适用

  1. fp=open('171017-1656_#23.DTA')
  2. lines = fp.readlines()
  3. fp.close()
  4. i = 0
  5. j = 0
  6. a = [[0] * 11 for i in range(50)]
  7. t = 0
  8. for line in lines:
  9. t1 = 1
  10. t2 = 1
  11. j = 0
  12. if t == 1:
  13. for x in line:
  14. if t1 == 0 and t2 == 1 : #01 str-空
  15. j += 1
  16. t1 = t2
  17. if x !=' ' and x != ' ': #如果x为str,t2等于0
  18. t2 = 0
  19. else: t2 = 1 #如果x为空,t2=1
  20. if t1 == 1 and t2 == 0 : #10 空-str
  21. a[i][j] = x
  22. else :
  23. if t1 == 0 and t2 == 0: #00 str-str
  24. a[i][j] += x
  25. i += 1
  26. else:
  27. if line == "\t#\ts\tHz\tohm\tohm\t\tV\tohm\t?A\t\tV\t\t#\n":
  28. t = 1
  29. for i in range(len(a)):
  30. print(a[i])

 和文件对照是没有任何问题的,接下来只需要将其转换成float格式接可以了

  1. for w in range(len(a)):
  2. for e in range(len(a[0])):
  3. a[w][e] = float(a[w][e])
  4. for i in range(len(a)):
  5. print(a[i])

 转换成功,接下来写入csv文件,写入其他格式的文件也一样

  1. import csv
  2. filelina =['Pt','Time','Freq','Zreal','Zimag','Zsig','Zmod','Zphz','Idc','Vdc','IERange']
  3. f = open('bbb.csv', 'w', encoding='UTF8', newline='')
  4. writer = csv.writer(f)
  5. writer.writerow(filelina)
  6. for i in range(len(a)):
  7. writer.writerow(a[i])
  8. f.close()

因为文件中标题和数据之间有一行多余的表示单位的字符,所以就没有把标题读取进来,需要在写入的时候加上这个标题,运行结果如下

 完成任务。

原文链接:https://blog.csdn.net/weixin_57702524/article/details/124950581



所属网站分类: 技术文章 > 博客

作者:坚持才能胜利

链接:https://www.pythonheidong.com/blog/article/1895645/32c2a6adef772021eaf9/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)