代码之家  ›  专栏  ›  技术社区  ›  Jonathan Allen Grant

当某些值包含分隔符作为值的一部分时,如何将“key=value,key=value,…”转换为csv?

  •  1
  • Jonathan Allen Grant  · 技术社区  · 7 年前

    我有一个格式的数据集 key1=value1, key2=value2, key3=value3... 其中每个键值对由一个 ", " .

    但是,有些值是长字符串,包含 ", " 作为价值的一部分。

    如何正确地浏览这些数据并将其转换为csv?

    我试过使用 csv.reader ,但它不起作用。

     data = row.lstrip('(').rstrip(')\n')                               
     reader = csv.reader(StringIO(data))                                
     for row2 in reader:                                                
         my_dict = {}                                                   
         for d in row2:                                                 
             my_dict[d.split('=')[0].lstrip()] = d.split('=', 1)[1]                                               
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Ajax1234    7 年前

    你可以用 re.findall 具有 itertools.groupby :

    import re, itertools as it
    def get_vals(d):
       r = [(a, list(b)) for a, b in it.groupby(re.findall('\w+\=|[^\s,]+', d), key=lambda x:x[-1] == '=')]
       return {r[i][-1][0][:-1]:', '.join(r[i+1][-1]) for i in range(0, len(r), 2)}
    
    tests = ['key1=value1, key2=value2, key3=value3', 'key1=va, lue1, key2=valu, e2, test, key3=value3']
    print(list(map(get_vals, tests)))
    

    输出:

    [{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, 
    {'key1': 'va, lue1', 'key2': 'valu, e2, test', 'key3': 'value3'}]
    
        2
  •  1
  •   James Brown    7 年前

    使用@Ajax1234的样本, re.split() 展望未来:

    import re
    str="key1=value1, key2=value2, key3=value3, key1=va, lue1, key2=valu, e2, test, key3=value3"
    re.split(", (?=[^ ]+=)",str)
    ['key1=value1', 'key2=value2', 'key3=value3', 'key1=va, lue1', 'key2=valu, e2, test', 'key3=value3']