从充满元数据的字典生成字符串的最pythonic方法是什么?

时间:2015-03-11 00:21:43

标签: python dictionary etl fixed-width

使用元数据字典编写固定宽度字符串是否有更多Pythonic方法,而不是创建for循环/嵌套for循环?

我的意见如下:

{
 't_order': 11112014,
 't_date': 20150101,
 't_external': 'from sample',
 't_mode': 'A',
 'message_id': 'ID01',
 't_value': 123.45
}

我的meta-dict看起来像这样:

[{'field': 'message_id',
  'decimalPrecision': '0',
  'isTypeOf': 'C',
  'Length': '8',
  'Level': '0',
  'Start': '1'},
 {'field': 't_mode',
  'decimalPrecision': '0',
  'isTypeOf': 'C',
  'Length': '1',
  'Level': '0',
  'Start': '9'},
 {'field': 't_order',
  'decimalPrecision': '0',
  'isTypeOf': '9',
  'Length': '8',
  'Level': '0',
  'Start': '10'},
 {'field': 't_external',
  'decimalPrecision': '0',
  'isTypeOf': 'C',
  'Length': '25',
  'Level': '0',
  'Start': '18'},
 {'field': 't_date',
  'decimalPrecision': '0',
  'isTypeOf': '9',
  'Length': '8',
  'Level': '0',
  'Start': '43'},
 {'field': 't_value',
  'decimalPrecision': '4',
  'isTypeOf': '9',
  'Length': '18',
  'Level': '0',
  'Start': '51'}]

isTypeOf == C的任何内容都是strisTypeOf == 9intStart值是字符串位置的开头,Length是左边空格填充字段的长度。数字字段不包含小数点,并且在精度中右对齐。话虽这么说,给定的样本将是:

ID01 A11112014from sample 20150101 1234500

什么是更有效的方式而不是循环/嵌套的for-statements?

2 个答案:

答案 0 :(得分:1)

想象有更好的方法来做到这一点,但这似乎有效:

def extract_elem(input_dict, meta_elem):
    val  = input_dict[meta_elem['field']]
    off  = int(meta_elem['Start'])
    flen = int(meta_elem['Length'])
    if meta_elem['isTypeOf'] == 'C':        # String
        return off, val.ljust(flen, ' ')
    if meta_elem['isTypeOf'] == '9':        # Float / Int
        prec = int(meta_elem['decimalPrecision'])
        fmt = "%%.%df" % prec
        val = (fmt % val).replace('.','')
        return off, val.rjust(flen, ' ')

def extract(input_dict, meta_list):
    s = ['' * 200]
    for m in meta_list:
        off, val = extract_elem(_input_dict, m)
        end = off + len(val)
        s[off:end] = val

    return ''.join(s)

print extract(_input_dict, _meta_list)

输出:

ID01    A11112014from sample              20150101           1234500

答案 1 :(得分:0)

我强烈建议for循环将是最pythonic的方式来做到这一点。 Python倾向于简洁的可读性

复杂比复杂

更好

也就是说,如果您的元数据是以字符串作为字典名称的字典,您可以索引字典并避免嵌套循环。

真正的pythonic要做的是确保原始记录是由生成器生成的,而不是加载到列表中。