首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套字典的CSV转换及几个方面的重新排列

嵌套字典的CSV转换及几个方面的重新排列
EN

Stack Overflow用户
提问于 2020-11-21 18:50:38
回答 1查看 106关注 0票数 1

我在CSV转换方面遇到了麻烦,我不太确定如何做到这一点(不太熟悉CSV转换,把它作为一个附带项目进行测试),我有一个嵌套字典,我想要创建到CSV中:

我想在ITEM_ID

  • Make列下设置STRONG_AXEFAST_AXE --另一个名为base的列,它包含攻击值101,与攻击速度相同。

  • Crit power有4个部分,基本、规模、扩展和最大扩展,我还想用10.0 0.1 0.1 0.2.

将所有这些(这是我的麻烦部分)转换成一个名为crit-power的列。

假设我有一个rpg的“axe.yml”:

代码语言:javascript
运行
复制
# axe.yml
STRONG_AXE:
  base: iron_axe
  attack-damage: 10
  attack-speed: 1
  crit-power:
      base: 10.0
      scale: 0.1
      spread: 0.1
      maxSpread: 0.2
FAST_AXE:
  base: copper_axe
  attack-damage: 5
  attack-speed: 2

现在我以f (file)的形式打开'axe.yml‘,然后将它转换为字典。

代码语言:javascript
运行
复制
#writer.py
import csv,yaml 

with open(r'axe.yml') as f:
    dict_data = yaml.load(f, Loader=yaml.FullLoader)
    print (dict_data)

然后出现的转换字典是:

代码语言:javascript
运行
复制
{'STRONG_AXE': {'base': 'iron_axe', 'attack-damage': 10, 'attack-speed': 1, 'crit-power': {'base': 10.0, 'scale': 0.1, 'spread': 0.1, 'maxSpread': 0.2}}, 'FAST_AXE': {'base': 'copper_axe', 'attack-damage': 5, 'attack-speed': 2}}

那么转换将如何工作呢?(删除了一段时间的编码,抱歉我.(新手)

EN

回答 1

Stack Overflow用户

发布于 2020-12-21 00:07:52

这里有一种处理嵌套数据的方法。它为嵌套字典中的每个项创建单独的字段,并在每个项的名称中添加一个前缀。

代码语言:javascript
运行
复制
import csv
import yaml
from pprint import pprint

inp_filepath = 'axe.yml'
outp_filepath = 'axe.csv'

FAST, STRONG = 'FAST_AXE', 'STRONG_AXE'  # Axe type ids.
COMMON_FIELDS = ['base', 'attack-damage', 'attack-speed']
STRONG_AXE_ONLY_FIELDS = ['base', 'scale', 'spread', 'maxSpread']
CRIT_POWER_FIELDS = [('crit-power-' + fieldname) for fieldname in STRONG_AXE_ONLY_FIELDS]
CSV_FILE_FIELDS = ['axe-type'] + COMMON_FIELDS + CRIT_POWER_FIELDS


with open(inp_filepath) as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

with open(outp_filepath, 'w', newline='') as file:
    writer = csv.DictWriter(file, CSV_FILE_FIELDS)
    writer.writeheader()

    for axetype, axedata in data.items():
        row = {'axe-type': axetype}

        if axetype == FAST:
            # Add common fields.
            row.update({fieldname: axedata[fieldname] for fieldname in COMMON_FIELDS})

        elif axetype == STRONG:
            # Add common fields.
            row.update({fieldname: axedata[fieldname] for fieldname in COMMON_FIELDS})

            # Then add renamed STRONG only fields.
            crit_power_data = axedata['crit-power']
            row.update({('crit-power-' + fieldname): crit_power_data[fieldname]
                            for fieldname in STRONG_AXE_ONLY_FIELDS})

        else:
            raise RuntimeError(f'unknown axe type "{axetype}" encountered')

#        pprint(row, sort_dicts=False)  # Show row data being written to file.
        writer.writerow(row)

print('Conversion completed')

下面是pprint()调用的一些示例输出,其中显示正在创建的带有前缀字段名键的row字典:

代码语言:javascript
运行
复制
{'axe-type': 'STRONG_AXE',
 'base': 'iron_axe',
 'attack-damage': 10,
 'attack-speed': 1,
 'crit-power-base': 10.0,
 'crit-power-scale': 0.1,
 'crit-power-spread': 0.1,
 'crit-power-maxSpread': 0.2}
{'axe-type': 'FAST_AXE',
 'base': 'copper_axe',
 'attack-damage': 5,
 'attack-speed': 2}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64946826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档