写出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-05 16:54:49 浏览: 119
以下是根据你的要求编写的Python代码,使用了argparse模块来解析命令行参数:
```python
import argparse
import os
import re
import csv
import matplotlib.pyplot as plt
def read_log_file(log_file):
with open(log_file, 'r') as f:
lines = f.readlines()
start_index = 0
for i, line in enumerate(lines):
if "My name is kitty" in line:
start_index = i + 1
return lines[start_index:]
def remove_duplicate_lines(lines):
unique_lines = []
for line in lines:
if line not in unique_lines:
unique_lines.append(line)
return unique_lines
def write_csv_file(output_file, lines):
with open(output_file, 'w', newline='') as f:
writer = csv.writer(f)
for line in lines:
if re.match(r'^\d+,\w+,.*$', line):
columns = re.split(r',\s*', line.strip())
writer.writerow(columns)
elif re.match(r'^\w+,\d+,\d+,\d+.*$', line):
columns = re.split(r',\s*', line.strip())
writer.writerow(columns)
def read_csv_file(output_file):
with open(output_file, 'r') as f:
reader = csv.reader(f)
rows = list(reader)
return rows
def plot_graphs(data, titles):
fig, axs = plt.subplots(2, 2)
axs = axs.flatten()
for i, ax in enumerate(axs):
x = [row[0] for row in data[i][1:]]
y = [float(row[1]) for row in data[i][1:]]
ax.plot(x, y)
ax.set_title(titles[i])
fig.tight_layout()
plt.show()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Process log file.')
parser.add_argument('log_file', help='path to log file')
args = parser.parse_args()
lines = read_log_file(args.log_file)
unique_lines = remove_duplicate_lines(lines)
output_file = os.path.splitext(args.log_file)[0] + ".csv"
write_csv_file(output_file, unique_lines)
rows = read_csv_file(output_file)
abc_dfg_cols = []
cat_cols = []
dog_cols = []
fish_cols = []
for i, col_name in enumerate(rows[0]):
if col_name in ['ABC', 'DFG']:
abc_dfg_cols.append(i)
elif col_name.startswith('CAT'):
cat_cols.append(i)
elif col_name.startswith('DOG'):
dog_cols.append(i)
elif col_name.startswith('Fish'):
fish_cols.append(i)
abc_dfg_data = [[rows[0][i]] + [row[i] for i in abc_dfg_cols] for row in rows]
cat_data = [[rows[0][i]] + [row[i] for i in cat_cols] for row in rows]
dog_data = [[rows[0][i]] + [row[i] for i in dog_cols] for row in rows]
fish_data = [[rows[0][i]] + [row[i] for i in fish_cols] for row in rows]
plot_graphs([abc_dfg_data, cat_data, dog_data, fish_data], ['ABC/DFG', 'CAT', 'DOG', 'Fish'])
```
这个脚本的工作流程如下:
1. 使用argparse模块解析命令行参数,获取log文件的路径。
2. 读取log文件,找到最后一次出现"My name is kitty"的位置,从下一行开始读取。
3. 删除所有重复的行,只留第一行。
4. 将第一行按照正则规则1分列后,写入新的CSV文件Output,从下一行开始按照正则规则2分列后,继续写入新的CSV文件Output。
5. 读取CSV文件Output,保存到一个二维列表中。
6. 把标题行分为4类,第一类是标题为ABC,DFG的2列,第二类是CAT开头的几列,第三类是DOG开头的几列,第四类是Fish开头的几列。
7. 把4类标题画成4个曲线图,标注每条线的标题。
注意,这个脚本假设log文件和CSV文件都是以UTF-8编码的。如果不是,需要在读写文件时指定正确的编码。
阅读全文