Python:将缺少数据和不规则模式的表转换为字典

2024-05-04 00:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python2.6中,什么样的pythonic方法可以过滤一个ASCII表,其中包含宽度不规则的列、缺少的数据和缩进的子条目,从而将它们转换为字典?你知道吗

col1      col2  col3       col4 
A         B                D          
 A1       B1    C1          
 A2       B2               

您希望输出类似于:

{"col1":"A","col2":"B","col3":"","col4":"D",
indented_entries:[
  {"col1":"A1","col2":"B1","col3":"C1","col4":""},
  {"col1":"A2","col2":"B2","col3":"","col4":""}
]}

虽然您可以遍历固定字符宽度的列,但我的问题是,是否有人对实现有一个优雅的想法?你知道吗


现实生活场景

我有一个ASCII表,其中有一些列和一些不规则的模式(缩进行)。数据如下:

ty      eq  status       use state  ord   capacity      free    ra  part high low
ma      10  m----3---r-   1% on          558.912G  555.888G    1M    16   80% 70%
 mm      11               1% on       0  558.912G  558.894G  [586042464 inodes]
 mr      12               1% on       1  558.912G  555.888G

我想将这些数据解析到一个字典中,使其看起来像这样:

{
  "ty": "ma",
  "eq": "10",
  "status": "m----3---r-",
  "use": "1%",
  "state": "on",
  "capacity": "558.912G",
  "free": "555.888G",
  "ra": "1M",
  "part": "16",
  "high": "80%",
  "low": "70%",
  "_ty": [
    {
      "ty": "mm",
      "eq": "11",
      "use": "1%",
      "state": "on",
      "ord": "0",
      "capacity": "558.912G",
      "free": "558.894G [586042464 inodes]"
    },
    {
      "ty": "m4",
      "eq": "12",
      "use": "1%",
      "state": "on",
      "ord": "1",
      "capacity": "558.912G",
      "free": "555.888G"
    }
  ]
}

我想知道一种在Python(2.6)中实现这一点的优雅方法。有什么想法吗?你知道吗

一个不考虑“子行”并且只返回顶层的解决方案也将被考虑。你知道吗

我的一些尝试:

def panda_conversion(filename):
        import pandas
        return pandas.read_csv(filename,sep='\s+').T.to_dict()


def convert_table_to_dict(filename):
        import csv
        return list(csv.DictReader(open(filename), delimiter=' '))


def convert_ascii_table(filename):
        import asciitable
        return asciitable.read(filename, Reader=asciitable.FixedWidth,
                col_starts=( 0, 8,  12, 25, 29, 37, 41, 51, 61, 69, 73, 78 ),
                col_ends  =( 2, 11, 23, 28, 34, 40, 50, 60, 68, 71, 76, 81 ))

if __name__ == '__main__':
        import sys
        import json
        filename = sys.argv[1:][0]
        print( panda_conversion( filename ) )
        print( json.dumps( convert_table_to_dict( filename ), indent=1))
        print( convert_ascii_table( filename ) )

顺便说一句,根据我的评论,这是不正确的,你不需要张贴代码。光想就够了。谢谢。你知道吗


Tags: importfreeconvertuseontablefilenamecol2
1条回答
网友
1楼 · 发布于 2024-05-04 00:20:45

这是可行的,但它是非常不Python。你知道吗

def iterate(filename):
        d={}
        f = open(filename,'r')
        header = f.readline().split()
        header_parent = list(header)
        header_parent.remove("ord")
        header_child = [e for e in header if e not in ("status","part","high","low" )]

        for line in f:
                if not line[0] == ' ':
                        for columns in header_parent:
                                d[columns] = line.split()[header_parent.index(columns)]
                else:
                        for columns in header_child:
                                d["_"+columns] = '' if (header_child.index(columns) >= len(line.split()) ) else line.split()[header_child.index(columns)]

        return d

你知道如何改进吗?你知道吗

相关问题 更多 >