如何将docker ps输出的文本文件高效转为Python可查询的DataFrame?
处理Docker PS输出文本转成Pandas DataFrame的有效方法
针对Docker PS输出的文本文件(列间为不定数量空格分隔),以下是几种高效转换为Pandas DataFrame的方案,方便后续数据查询:
方法一:用Pandas固定宽度读取(最省心)
Docker PS的输出是标准固定宽度表格,read_fwf可以自动识别列宽,完美适配这种场景:
import pandas as pd # 读取固定宽度格式的文本文件 df = pd.read_fwf("docker.txt") # 示例:根据容器名称查询容器ID target_id = df.loc[df['NAMES'] == 'random name', 'CONTAINER ID'].iloc[0] print(target_id)
方法二:正则表达式分割(适配特殊场景)
如果固定宽度识别异常,可通过正则匹配至少两个空格作为列分隔符,保留字段内部的空格:
import pandas as pd import re # 读取并清洗文本行 with open("docker.txt", 'r') as f: lines = [line.strip() for line in f if line.strip()] # 提取表头和数据行 headers = re.split(r'\s{2,}', lines[0]) data = [] for line in lines[1:]: row = re.split(r'\s{2,}', line) # 处理PORTS字段为空的情况,保证字段数与表头一致 if len(row) < len(headers): row.insert(-1, '') data.append(row) # 构建DataFrame df = pd.DataFrame(data, columns=headers) # 示例查询 target_id = df[df['NAMES'] == 'random name']['CONTAINER ID'].values[0] print(target_id)
方法三:直接调用Docker SDK(跳过文本处理)
若环境允许直接访问Docker API,推荐用docker库直接获取容器数据,无需处理文本:
import docker import pandas as pd # 初始化Docker客户端 client = docker.from_env() # 获取所有容器(all=True包含已停止的) containers = client.containers.list(all=True) # 提取所需字段 container_data = [] for container in containers: # 处理镜像标签(无标签则用镜像ID前12位) image_tag = container.image.tags[0] if container.image.tags else container.image.id[:12] # 处理端口信息 ports = [] if container.attrs['NetworkSettings']['Ports']: for port_info in container.attrs['NetworkSettings']['Ports'].values(): if port_info: ports.append(f"{port_info[0]['HostPort']}:{port_info[0]['PrivatePort']}/{port_info[0]['Type']}") port_str = ', '.join(ports) if ports else '' container_data.append({ 'CONTAINER ID': container.short_id, 'IMAGE': image_tag, 'COMMAND': ' '.join(container.attrs['Config']['Cmd']) if container.attrs['Config']['Cmd'] else '', 'CREATED': container.attrs['Created'], 'STATUS': container.status, 'PORTS': port_str, 'NAMES': container.name }) df = pd.DataFrame(container_data) # 示例查询 target_id = df[df['NAMES'] == 'random name']['CONTAINER ID'].values[0] print(target_id)
内容的提问来源于stack exchange,提问作者Lakshmi Narayanan
相关产品推荐
相关产品推荐

