写出python代码,用argparse。能在任何文件夹读取Log。具体如下: 1.读取log,当读取到最后一次出现"My name is kitty"时,从下一行开始读 2.删除所有重复的行,只留第一行 3.逐行写入csv 4.第1行按照正则规则1提取单词,然后分列,分列后才知道有多少列,分列符号也不知道有几个空格。 5.从第2行开始按照正则规则2分列后,才知道有多少列,分列符号也不知道有几个空格。 6.读取CSV文件Output 7.把标题行分为4类,第一类是标题为ABC,DFG的2列,第二类是CAT开头的几列,第三类是DOG开头的几列,第四类是Fish开头的几列 8.把4类标题画成4个曲线图,标注每条线的标题
时间: 2024-03-06 20:51:56 浏览: 60
以下是能够实现上述功能的 Python 代码:
```python
import argparse
import csv
import re
import matplotlib.pyplot as plt
# 定义 argparse
parser = argparse.ArgumentParser(description='Process log file and output csv file')
parser.add_argument('log_file', metavar='log_file', type=str,
help='path to log file')
parser.add_argument('csv_file', metavar='csv_file', type=str,
help='path to csv file')
args = parser.parse_args()
# 读取 log 文件
with open(args.log_file) as f:
lines = f.readlines()
# 找到最后一次出现 "My name is kitty" 的行
last_kitty_idx = None
for i, line in enumerate(lines):
if "My name is kitty" in line:
last_kitty_idx = i
# 从下一行开始读取
lines = lines[last_kitty_idx+1:]
# 删除所有重复的行,只留第一行
unique_lines = []
for line in lines:
if line not in unique_lines:
unique_lines.append(line)
# 写入 csv 文件
with open(args.csv_file, mode='w') as f:
writer = csv.writer(f)
# 第 1 行按照正则规则 1 提取单词,然后分列
headers = re.findall(r'\w+', unique_lines[0].strip())
writer.writerow(headers)
# 从第 2 行开始按照正则规则 2 分列
for line in unique_lines[1:]:
row = re.split(r'\s+', line.strip())
writer.writerow(row)
# 读取 csv 文件
with open(args.csv_file, mode='r') as f:
reader = csv.reader(f)
rows = [row for row in reader]
# 把标题行分为 4 类
abc_dfg_cols = []
cat_cols = []
dog_cols = []
fish_cols = []
for i, header in enumerate(rows[0]):
if header in ["ABC", "DFG"]:
abc_dfg_cols.append(i)
elif header.startswith("CAT"):
cat_cols.append(i)
elif header.startswith("DOG"):
dog_cols.append(i)
elif header.startswith("Fish"):
fish_cols.append(i)
# 把 4 类标题画成 4 个曲线图,标注每条线的标题
plt.figure(figsize=(10, 6))
for cols, title in [(abc_dfg_cols, "ABC/DFG"), (cat_cols, "CAT"), (dog_cols, "DOG"), (fish_cols, "Fish")]:
x = [row[0] for row in rows[1:]]
for col_idx in cols:
y = [float(row[col_idx]) for row in rows[1:]]
plt.plot(x, y, label=rows[0][col_idx])
plt.title(title)
plt.xlabel("Time")
plt.ylabel("Value")
plt.legend()
plt.show()
```
阅读全文