使用正则表达式读取文本数据
假如我们需要处理的数据具有很强的规律性, 例如下面这样, 数据基本上都是一个独立的一行, 并且每个数据都有名称标志.
txt
RUN
OU = 1.903784
OV = 1.862293
OW = 1.860681
OUINV = 548.000793
STOP
index = 1
V = 0.000000
W = 0.000000
E_theta = 0.000000
UINV = 0.000000
fault_flag= 0
index = 2
V = -0.025882
W = 0.044830
E_theta = -0.523599
UINV = 0.000000
fault_flag= 0
index = 3
V = 0.220001
W = -0.201728
E_theta = 2.312893
UINV = 0.000000
fault_flag= 0
假设我们需要提取E_theta =
后面的数据并绘制为图像, 使用手工处理耗费大量的人力和时间, 这时我们可以用python
脚本快速完成这一功能. 以下为详细步骤
1、导入所需要的库
python
import re # 导入正则表达式模块库
import matplotlib.pyplot as plt
导入正则表达式re
库和绘制图像常用的matplotlib
库
re
库python
自带;
matplotlib
需要用户自己安装, 使用以下命令可安装该库
cmd
pip install matplotlib
2、读取存储原始数据的文本文件
python
# 从文件中读取数据
file_path = 'data.txt' # 替换为你的文件路径
# 以只读模式打开文件
# 通常使用默认编码来读取文件, 如果使用其他编码, 可以指定encoding参数
with open(file_path, 'r') as file:
data = file.read() # 读取文件的全部内容, 并返回一个字符串
如果文件使用GBK编码, 则可以这样写
python
with open(file_path, 'r', encoding='gbk') as file:
data = file.read()
with
用于管理文件的上下文, 可以确保文件在使用后自动关闭, 即使在读取文件发生异常时也是如此.
r
表示以只读模式
打开文件.
3、使用正则表达式提取数据
python
#
# re.findall(pattern,string) 在字符串中搜索所有匹配的模式, 如果匹配成功则返回一个匹配对象
# \s* 匹配任何空白字符, 包括空格、制表符、换行符等
# * 表示匹配前面的字符0次或多次
# 用于处理E_theta和 = 之间可能存在的任意数量的空格
# ([-\d.]+)
# () 表示捕获组, 用于提取匹配的部分
# [-\d.] 是一个字符集, 匹配以下任意一个字符
# - 匹配负号
# \d 匹配任何数字
# . 匹配小数点
# + 表示匹配前面的字符集1次或多次
# [RegExr: Learn, Build, & Test RegEx](https://regexr.com/)
# \b 表示单词边界匹配符, 确保E_theta是一个独立的单词, 防止匹配到带有前缀和后缀的单词
e_theta_values = re.findall(r'\bE_theta\s*=\s*([-\d.]+)', data)
# 将提取的字符串转换为浮点数
e_theta_values = [float(value) for value in e_theta_values]
# 输出 E_theta 数据
print("E_theta 数据:")
for value in e_theta_values:
print(value)
4、使用matplotlib绘制曲线
python
# 绘制图像
# marker='o', 表示指定数据点的标记类型为圆圈o
# linestyle='-', 指定线的样式为实线
# color='r' 指定线的颜色为红色
plt.plot(e_theta_values, marker='o', linestyle='-', color='r', label='E_theta')
plt.title('E_theta data change') # 设置图表的标题
plt.xlabel('index') # 设置X轴标签内容
plt.ylabel('E_theta value') # 设置Y轴标签内容
plt.grid(True) # 显示网格
plt.legend() # 显示图例
plt.show()
运行程序后即可得到图像