写出python代码,用argparse。能在任何文件夹读取Log。具体如下: 1.读取log,当读取到最后一次出现"My name is kitty"时,从下一行开始读 2.删除所有重复的行,只留第一行 3.第一行按照正则规则1分列后,写入新的CSV文件Output 4.从下一行开始按照正则规则2分列后,继续写入新的CSV文件Output 5.读取CSV文件Output 6.把标题行分为4类,第一类是标题为ABC,DFG的2列,第二类是CAT开头的几列,第三类是DOG开头的几列,第四类是Fish开头的几列 7.把4类标题画成4个曲线图,标注每条线的标题
时间: 2024-03-06 09:47:16 浏览: 63
以下是实现上述功能的 Python 代码,使用了 argparse 进行命令行参数解析:
```python
import argparse
import re
import pandas as pd
import matplotlib.pyplot as plt
# 定义正则规则1和正则规则2
REGEX1 = r"(\d+)\s+(\d+.\d+)\s+(\d+.\d+)\s+(\d+.\d+)"
REGEX2 = r"(\d+)\s+(\d+.\d+)\s+(\d+.\d+)"
def parse_args():
parser = argparse.ArgumentParser(description='处理log文件并生成曲线图')
parser.add_argument('input_file', help='输入文件名')
parser.add_argument('output_file', help='输出文件名')
return parser.parse_args()
def read_log(filename):
with open(filename, 'r') as f:
lines = f.readlines()
# 找到最后一次出现"My name is kitty"的位置
idx = len(lines) - 1
while idx >= 0:
if "My name is kitty" in lines[idx]:
break
idx -= 1
# 从下一行开始读取,去除重复行
data = []
for line in set(lines[idx+1:]):
data.append(line.strip())
return data
def parse_data(data):
# 第一行按照正则规则1分列
columns = ['A', 'B', 'C', 'D']
df1 = pd.DataFrame([re.findall(REGEX1, data[0])[0]], columns=columns)
# 从下一行开始按照正则规则2分列
df2 = pd.DataFrame([re.findall(REGEX2, line)[0] for line in data[1:]],
columns=['E', 'F', 'G'])
# 合并两个数据框
df = pd.concat([df1, df2], axis=1)
return df
def write_csv(df, filename):
df.to_csv(filename, index=False)
def read_csv(filename):
df = pd.read_csv(filename)
return df
def plot_data(df):
# 分类绘制曲线图
fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(df['ABC'], label='ABC')
axs[0, 0].plot(df['DFG'], label='DFG')
axs[0, 0].set_title('Title for ABC and DFG')
axs[0, 0].legend()
axs[0, 1].plot(df.filter(regex='^CAT'), label='CAT')
axs[0, 1].set_title('Title for CAT')
axs[0, 1].legend()
axs[1, 0].plot(df.filter(regex='^DOG'), label='DOG')
axs[1, 0].set_title('Title for DOG')
axs[1, 0].legend()
axs[1, 1].plot(df.filter(regex='^Fish'), label='Fish')
axs[1, 1].set_title('Title for Fish')
axs[1, 1].legend()
plt.show()
def main():
args = parse_args()
# 读取log文件
data = read_log(args.input_file)
# 解析数据,写入CSV文件
df = parse_data(data)
write_csv(df, args.output_file)
# 读取CSV文件,画图
df = read_csv(args.output_file)
plot_data(df)
if __name__ == '__main__':
main()
```
假设输入文件名为 `input.log`,输出文件名为 `output.csv`,可以使用以下命令运行程序:
```
python program.py input.log output.csv
```
其中 `program.py` 为程序名。
阅读全文