# -*- coding: utf-8 -*- import re import subprocess # 运行命令并获取输出 command = 'ls -rtd /home/cxcc/log/debug/* | tail -n 1 | xargs cat | grep "phoneModel"' output = subprocess.check_output(command, shell=True, universal_newlines=True) # 提取所有匹配项 pattern = r"设备品牌:(.+?) - 设备型号:(.+?) - 系统版本:(.+?) - APP版本:(.+?) - 录音位置:(.+?)\," matches = re.findall(pattern, output) # 提取所有agent属性 agent_pattern = r"agent=(\d+)" agent_matches = re.findall(agent_pattern, output) # 将匹配项和agent属性合并为一个列表 data = [(matches[i], agent_matches[i]) for i in range(len(matches))] # 将列表转换为set以删除重复项 unique_data = list(set(data)) # 对结果进行排序 unique_data.sort() # 将结果输出到txt文件中 with open("output.txt", "w") as f: for match, agent in unique_data: f.write("设备品牌:" + match[0] + "\n") f.write("设备型号:" + match[1] + "\n") f.write("系统版本:" + match[2] + "\n") f.write("APP版本:" + match[3] + "\n") f.write("录音位置:" + match[4] + "\n") f.write("agent:" + agent + "\n") f.write("\n") 这段代码有什么优化建议
时间: 2024-03-06 22:49:19 浏览: 64
jdbc:mysql://localhost:3306/webshopping?useUnicode=truecharacterEncoding=UTF-8
这段代码的优化建议如下:
1. 使用subprocess.run代替subprocess.check_output,这样可以更好地处理错误情况。
2. 使用with语句管理文件句柄,可以自动关闭文件,不需要手动调用close()方法。
3. 将匹配和输出分离成两个函数,使代码更易读。
4. 使用re.finditer代替re.findall,可以避免在内存中创建一个完整的列表,而是每次迭代只产生一个匹配项。
5. 将re.compile放在函数外部,这样可以避免在每次调用函数时都重新编译正则表达式。
6. 添加一些注释,使代码更易于理解。
下面是优化后的代码示例:
```python
import re
import subprocess
# 编译正则表达式,以便在多次调用函数时重用
MATCH_PATTERN = re.compile(r"设备品牌:(.+?) - 设备型号:(.+?) - 系统版本:(.+?) - APP版本:(.+?) - 录音位置:(.+?)\,")
AGENT_PATTERN = re.compile(r"agent=(\d+)")
def get_output(command):
"""运行命令并返回输出结果。"""
try:
result = subprocess.run(command, shell=True, check=True, stdout=subprocess.PIPE, universal_newlines=True)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"Error running command: {e}")
return ""
def extract_data(output):
"""从输出中提取匹配项和agent属性,返回一个包含它们的元组列表。"""
matches = MATCH_PATTERN.finditer(output)
agent_matches = AGENT_PATTERN.findall(output)
data = [(match.groups(), agent) for match, agent in zip(matches, agent_matches)]
return data
def write_output(data, filename):
"""将数据写入到指定的文件中。"""
with open(filename, "w") as f:
for match, agent in data:
f.write("设备品牌:" + match[0] + "\n")
f.write("设备型号:" + match[1] + "\n")
f.write("系统版本:" + match[2] + "\n")
f.write("APP版本:" + match[3] + "\n")
f.write("录音位置:" + match[4] + "\n")
f.write("agent:" + agent + "\n")
f.write("\n")
if __name__ == "__main__":
command = 'ls -rtd /home/cxcc/log/debug/* | tail -n 1 | xargs cat | grep "phoneModel"'
output = get_output(command)
data = extract_data(output)
# 将结果按照设备品牌进行排序
data.sort(key=lambda x: x[0][0])
write_output(data, "output.txt")
```
阅读全文