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

如何在Python中将Linux CLI命令输出导入数据表?

在Python中导入CLI命令输出到Pandas DataFrame的最优方法

你的代码问题主要出在三个地方:

  • pd.append已被弃用,且循环追加的方式效率极低
  • subprocess.check_output返回的是字节串,未解码为字符串就直接处理
  • 没有解析ls -al的结构化输出,直接把整行当成单个数据列

下面是两种最优解决方法,可根据需求选择:

方法一:利用Pandas的read_csv直接解析(推荐)

借助Pandas内置的文本解析能力,代码简洁高效,适合大多数CLI命令的结构化输出:

import pandas as pd
import subprocess
from io import StringIO

# 执行CLI命令并获取文本输出
cmd = "ls -al"
output = subprocess.check_output(cmd, shell=True, text=True)

# 将输出包装成可读取的文件对象,用read_csv解析
df = pd.read_csv(
    StringIO(output),
    sep=r'\s+',  # 匹配一个或多个空格作为分隔符
    skiprows=1,  # 跳过第一行的"total xxx"汇总行
    names=['权限', '硬链接数', '所有者', '组', '大小', '修改时间', '文件名']
)

print(df)

如果系统默认编码不是UTF-8,可手动指定解码:

output = subprocess.check_output(cmd, shell=True).decode('gbk')  # 替换为对应编码

方法二:手动解析每行(适合复杂格式)

如果CLI输出格式特殊(比如文件名包含空格),可以手动拆分每行内容,再构建DataFrame:

import pandas as pd
import subprocess

cmd = "ls -al"
# 获取输出并按行拆分,跳过第一行汇总信息
output_lines = subprocess.check_output(cmd, shell=True, text=True).splitlines()[1:]

# 解析每行:前8个字段用空格拆分,最后一个字段保留完整文件名(含空格)
parsed_data = []
for line in output_lines:
    # maxsplit=8 表示最多拆分8次,最后一部分作为文件名
    parts = line.split(maxsplit=8)
    parsed_data.append(parts)

# 构建DataFrame,注意修改时间被拆成了月、日、时间/年三列
df = pd.DataFrame(
    parsed_data,
    columns=['权限', '硬链接数', '所有者', '组', '大小', '月', '日', '时间/年', '文件名']
)

print(df)

关键注意事项

  • 避免循环追加DataFrame:这种方式会反复创建新对象,性能极差,建议先收集所有数据到列表,再一次性转成DataFrame
  • 处理字节串:确保将subprocess的输出解码为字符串,使用text=True参数或者.decode()方法
  • 适配输出格式:不同CLI命令的输出结构不同,需要调整sep、skiprows、列名等参数

内容的提问来源于stack exchange,提问作者e-on

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:45:36