You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:08:32