使用python中的列表数据修改yaml文件中的字典

时间:2017-11-06 15:40:39

标签: python pandas csv dictionary yaml

我正在尝试使用python修改/更新yaml配置文件。 想要修改的部分是字典,这里有一个yaml文件结构的例子:

DEFAULT:
    zoneID_dictionary_2:      # Usual activity place.
        -1:     'Unknown zone'
        1:      'Zone XX 01'
        2:      'Zone XX 02'
        999:    'Unknown zone'

使用pandas我加载了一个CSV文件,我将从中提取所需的新词典。这里有我的代码摘录:

def yml_manager(config_template_file_path, output_file_path, customers_catchment_area_dict_file_path=None):

    # Load the template of the configuration file
    stream = open(config_template_file_path, 'r')
    config = yaml.load(stream=stream)

    # Update directories
    config['DEFAULT']['dir_path_1'] = '_new_path_1_'
    config['DEFAULT']['dir_path_2'] = '_new_path_2_'

    if customers_catchment_area_dict_file_path is not None:
        df = pandas.read_csv(customers_catchment_area_dict_file_path, sep=';') 
        config['DEFAULT']['zoneID_dict'] = {x: y for x, y in zip(df['zone_ID'].tolist(), df['zone_name'].tolist())}

    with open(output_file_path, 'w') as yml_file:
        yml_file.write(yaml.dump(data=config, default_flow_style=False))
        yml_file.close()

通过使用此代码,我有以下例外: TypeError:数据类型不理解 /转储文件时。另一方面,当我在代码中创建字典时,如下所示:

    d = {-1: 'Unknown zone',
         1: 'catchment_zone_01',
         2: 'catchment_zone_02'}
    config['DEFAULT']['zoneID_dict'] = d

不再引发异常。

由于这个项目的上下文,我必须使用YAML文件并从具有数百行的CSV文件中加载字典信息(我将使用pandas清理),所以任何关于我做错的想法?​​< / p>

先谢谢大家!

1 个答案:

答案 0 :(得分:0)

我发现问题,似乎当我尝试转储新文件时,yaml.dump无法识别由pandas分配给整数的数据类型。因此,我们可以通过在创建字典时添加强制转换来解决此问题:

config['DEFAULT']['zoneID_dict'] = {int(x): y for x, y in zip(df['zone_ID'].tolist(), df['zone_name'].tolist())}