求助:使用Python从无序TXT文件按公司分组离线站点的实现思路
解决思路与代码示例
核心思路
- 识别文本中的路径标识行(以
Root\开头),从中提取公司名称 - 遍历文本时维护「当前所属公司」状态变量,后续站点行默认归属于最近路径行对应的公司
- 用字典存储分组结果:键为公司名,值为该公司下所有Offline站点的列表
具体步骤
解析文本结构
先快速扫描TXT文件,确认路径行与站点行的对应规则:通常路径行是一批站点的归属标识,后续站点直到下一个路径行都属于该公司。若存在乱序(如站点行先于路径行),可将这类站点归入「Unknown Company」。提取公司名称
对路径行(如Root\XX Company X\Local Sites)用split('\\')分割字符串,取索引为1的元素(即XX Company X)作为公司名,用strip()清理多余空格。筛选Offline站点并分组
遍历每一行:- 若为路径行:更新「当前公司」,并在字典中初始化该公司的空列表(如果不存在)
- 若为站点行:按
': '分割提取站点名和状态,转小写判断是否为offline,若是则添加到当前公司的列表中 - 空行或无效行直接跳过
代码示例
# 初始化存储结构:公司名 -> Offline站点列表 offline_groups = {} current_company = None # 读取报告文件 with open('network_monitor.txt', 'r', encoding='utf-8') as report_file: for line in report_file: clean_line = line.strip() # 跳过空行 if not clean_line: continue # 处理路径行,更新当前公司 if clean_line.startswith('Root\\'): path_parts = clean_line.split('\\') # 确保路径格式符合预期(至少3层:Root\公司\站点类型) if len(path_parts) >= 3: current_company = path_parts[1].strip() # 初始化公司对应的列表(如果不存在) if current_company not in offline_groups: offline_groups[current_company] = [] continue # 处理站点状态行 if ': ' in clean_line: site_info = clean_line.split(': ', 1) if len(site_info) != 2: # 格式无效的行,跳过 continue site_name, status = site_info site_name = site_name.strip() status = status.strip().lower() # 仅收集Offline状态的站点 if status == 'offline': if current_company is not None: offline_groups[current_company].append(site_name) else: # 无归属公司的Offline站点,归入Unknown if 'Unknown Company' not in offline_groups: offline_groups['Unknown Company'] = [] offline_groups['Unknown Company'].append(site_name) # 输出分组结果 print("Offline站点按公司分组:") for company, sites in offline_groups.items(): print(f"\n* {company}:") for site in sites: print(f" - {site}")
优化建议
- 合并同公司多路径:如果同一家公司有多个路径行(如Local和Remote),字典会自动合并该公司的所有Offline站点
- 扩展状态判断:如果状态字段有其他写法(如
Down、Unavailable),可扩展判断条件为if status in ['offline', 'down', 'unavailable'] - 异常日志:添加
logging模块记录无效行或异常路径,方便后续排查
内容的提问来源于stack exchange,提问作者Jonathan López
相关产品推荐
相关产品推荐

