如何在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
相关产品推荐
相关产品推荐

