写出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 22:47:27 浏览: 73
python 读取更新中的log 或其它文本方式
以下是实现上述功能的 Python 代码,使用了 argparse 进行命令行参数解析:
```python
import argparse
import re
import pandas as pd
import matplotlib.pyplot as plt
# 定义正则规则1和正则规则2
REGEX1 = r"(\d+\.\d+)\s+"
REGEX2 = r"(\d+\.\d+)\s+"
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分列
columns1 = [f'col{i}' for i in range(1, len(data[0].split())+1)]
df1 = pd.DataFrame([re.findall(REGEX1, data[0])], columns=columns1)
# 从下一行开始按照正则规则2分列
columns2 = [f'col{i}' for i in range(1, len(data[1].split())+1)]
df2 = pd.DataFrame([re.findall(REGEX2, line) for line in data[1:]], columns=columns2)
# 合并两个数据框
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)
# 把标题行分为4类
df.columns = df.columns.str.strip() # 去除列名前后的空格
df_abc = df[['col1', 'col2']] # ABC和DFG
df_cat = df.filter(regex='^CAT') # CAT开头的列
df_dog = df.filter(regex='^DOG') # DOG开头的列
df_fish = df.filter(regex='^Fish') # Fish开头的列
# 画图
plot_data(df_abc)
plot_data(df_cat)
plot_data(df_dog)
plot_data(df_fish)
if __name__ == '__main__':
main()
```
假设输入文件名为 `input.log`,输出文件名为 `output.csv`,可以使用以下命令运行程序:
```
python program.py input.log output.csv
```
其中 `program.py` 为程序名。
阅读全文