当某些值包含定界符作为值的一部分时,如何将“键=值,键=值,...”转换为csv?

时间:2019-09-20 20:22:36

标签: python csv data-cleaning

我有一个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]                                               

2 个答案:

答案 0 :(得分:2)

您可以将re.findallitertools.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'}]

答案 1 :(得分:1)

使用@ 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']