Python конвертировать байтовую строку в список словарей на основе новой строки - PullRequest
0 голосов
/ 27 мая 2019

У меня есть строковый байт

data = b'ra1,rb1,rc1\nra2,rb2,rc2\nra3,rb3,rc3\nra4,rb4,rc4' # No \n at the end

Результат должен быть как

result = [
{"field1": "ra1", "field2": "rb1", "field3": "rc1"},
{"field1": "ra2", "field2": "rb2", "field3": "rc2"},
{"field1": "ra3", "field2": "rb3", "field3": "rc3"},
{"field1": "ra4", "field2": "rb4", "field3": "rc4"}
]

Я пытался

result = csv.DictReader(data, fieldnames=('field1', 'field2', 'field3'))

Обратите внимание, что я не имею здесь дело с файлами CSV.
Я знаю, что нам нужно передать объект файла в качестве первого параметра вышеупомянутому методу DictReader, чтобы получить вышеуказанный результат.
Есть ли подобный встроенный метод в Python 3.6 для достижения моего результата?
Здесь я не хочу использовать цикл, поскольку мои данные будут очень большими.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019
import pandas as pd, io
data = b'ra1,rb1,rc1\nra2,rb2,rc2\nra3,rb3,rc3\nra4,rb4,rc4'
names = {0:'fields1',1:'fields2',2:'fields3'}

pd.read_csv(io.StringIO(data.decode('utf8')),header=None).rename(names,axis=1).to_dict('records')

[{'fields1': 'ra1', 'fields2': 'rb1', 'fields3': 'rc1'},
 {'fields1': 'ra2', 'fields2': 'rb2', 'fields3': 'rc2'},
 {'fields1': 'ra3', 'fields2': 'rb3', 'fields3': 'rc3'},
 {'fields1': 'ra4', 'fields2': 'rb4', 'fields3': 'rc4'}]
0 голосов
/ 27 мая 2019

Вы можете создать список списков всех значений, разделив на \n, а затем ,

Затем вы можете zip ключи с каждым подсписком значений, чтобы создать свой список словарей

Следовательно, код будет

data = b'ra1,rb1,rc1\nra2,rb2,rc2\nra3,rb3,rc3\nra4,rb4,rc4'
keys = ['field1', 'field2', 'field3']

#Create list of lists for values
values  = [ item.split(',') for item in data.decode('utf-8').splitlines() ]
#[['ra1', 'rb1', 'rc1'], ['ra2', 'rb2', 'rc2'], ['ra3', 'rb3', 'rc3'], ['ra4', 'rb4', 'rc4']]

#Create result dictionary by zipping keys and values
result = [dict(zip(keys, value)) for value in values]
print(result)

И вывод будет

[{'field1': 'ra1', 'field2': 'rb1', 'field3': 'rc1'}, 
{'field1': 'ra2', 'field2': 'rb2', 'field3': 'rc2'}, 
{'field1': 'ra3', 'field2': 'rb3', 'field3': 'rc3'}, 
{'field1': 'ra4', 'field2': 'rb4', 'field3': 'rc4'}]
...