如何正确拆分df命令输出,实现指定列表元素分配?
解决df命令输出字段拆分问题
我明白你现在的困扰——想用Python拆分df命令的输出结果,但不管是用split还是存列表,都没法拿到想要的有效字段。咱们先看看问题出在哪,再一步步解决。
问题根源
你当前的Linux命令里,sed -e 's/ / : /g'把每个空格都替换成了:,导致输出里出现大量连续的:(比如/dev/mapper/centos-root : : : : 52403200...)。而且你之前误操作了read_contents[0],这是取整个字符串的第一个字符,不是拆分后的元素,自然得到/或者d。
方案一:调整Linux命令,直接输出干净的分隔字段
既然df -P的输出是用多个空格分隔的,咱们可以跳过sed,直接用awk提取需要的字段并指定分隔符,这样输出就没有多余的空项了:
command = ("df -P | egrep '([20][0-9]|100)%' | awk '{print $1\":\"$2\":\"$3\":\"$4\":\"$5\":\"$6\":\"$7\":\"$8}'")
这样执行后,read_contents的内容会变成类似:/dev/mapper/centos-root:52403200:14460252:37942948:28%:/
之后在Python里直接用split(':')就能得到干净的列表:
k = read_contents.strip().split(':') # 此时k[0] = '/dev/mapper/centos-root',k[1] = '52403200',完全符合你的需求
方案二:在Python里处理现有格式的字符串
如果不想改Linux命令,咱们可以在Python里过滤掉拆分后的空元素:
# 先去掉首尾的换行和空格,再按换行分割(处理多行情况) lines = read_contents.strip().split('\n') for line in lines: # 按冒号分割所有元素,然后过滤掉空或纯空格的项,再去除每个元素的首尾空格 k = [item.strip() for item in line.split(':') if item.strip()] # 现在k就是你要的有效字段列表了 print(k) # 示例输出:['/dev/mapper/centos-root', '52403200', '14460252', '37942948', '28%', '/']
这样不管哪种方式,都能轻松拿到你想要的拆分结果啦~
内容的提问来源于stack exchange,提问作者Sahil Manoharan




