【问题标题】:Python convert byte string to list of dictionaries based on newlinePython基于换行符将字节字符串转换为字典列表
【发布时间】:2019-05-27 17:45:23
【问题描述】:

我有一个字符串字节

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中是否有类似的内置方法来实现我的结果?
在这里我不想使用循环,因为我的数据会非常庞大​​。

【问题讨论】:

  • 看看这个答案,使用 csv 包的阅读器解决类似的问题:stackoverflow.com/questions/53278358/…
  • 数据的大小与是否应该使用循环无关。
  • 你试过的代码有什么问题?
  • @sekky,即使我也不想使用 pandas 包,因为它的包体积很大,而且有很多依赖包。对于这一行,我不想在我的应用程序服务器中浪费 27 MB。
  • @mkrieger1,我没有处理任何 CSV 文件。这就是问题。这个 DictReader 方法在 CSV 包中可用。

标签: python-3.x dictionary byte


【解决方案1】:

您可以通过在\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'}]

【讨论】:

  • 在没有这么多循环的情况下,是否有任何 python 内置方法来实现这一点?由于我的数据非常大,这将花费两倍的时间。
  • 好吧,你需要遍历所有项目至少一次来处理它们,这是 for 循环所做的(它一次性涵盖所有项目,你可以看到相同的值列表的输出),所以你无法避免它@CMY 所有其他解决方案也需要这样做
  • 嗨@CMY 如果您还有任何问题,请告诉我:) 否则,如果答案对您有所帮助,请考虑通过单击答案旁边的勾号将其标记为已接受 :) 我也建议您来看看stackoverflow.com/help/someone-answers
【解决方案2】:
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'}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2016-12-05
    • 2011-07-12
    • 2014-05-23
    • 2019-05-29
    相关资源
    最近更新 更多