You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除嵌套字典中literal_str值外层的单引号

问题

读取Excel文件转换为字典后,基于该字典创建嵌套字典时遇到问题:键pattern的值需要是自定义类literal_str的实例,但当前输出中该值外层带有单引号,变成了字符串形式,不符合需求。需要移除单引号,让pattern指向literal_str的实例。

当前输出

{'rules': {'VALID_CUSTOMER_ID': {'rule_type': 'REGEX', 'dimension': 'accuracy', 'params': {'pattern': 'literal_str("^[0-9]+$")'}}}}

预期输出

{'rules':{'VALID_CUSTOMER_ID':{'rule_type': 'REGEX','dimension':'accuracy','params': {'pattern': literal_str('^[0-9]+$')}}}}

原始代码

import openpyxl
import yaml
from yaml.representer import SafeRepresenter

class folded_str(str): pass
class literal_str(str): pass
class literal_unicode(str): pass


def change_style(style, representer):
    def new_representer(dumper, data):
        scalar = representer(dumper, data)
        scalar.style = style
        return scalar
    return new_representer

class MyDumper(yaml.Dumper):
    def increase_indent(self, flow=False, indentless=False):
        return super(MyDumper, self).increase_indent(flow, False)

represent_literal_str = change_style('|', SafeRepresenter.represent_str)
yaml.add_representer(literal_str, represent_literal_str)

wb = openpyxl.load_workbook('C:\\Users\\Desktop\\config.xlsx')
ws = wb['rule']
final = {}
excel_read = {}

def iter_rows(active):
    for row in active.iter_rows():
        # data = [cell.value for cell in row]
        # print(type(data))
        yield [cell.value for cell in row]

res = iter_rows(ws)
keys = next(res)

for new in res:
    excel_read = dict(zip(keys, new))
    print(excel_read)

#Create rule for YAML
output_rules = {}
temp = {}
temp['pattern'] = excel_read['pattern']
output_rules = temp.copy()
temp.clear()
temp['params'] = {}
temp['params'] ['pattern'] = output_rules['pattern']
output_rules = temp.copy()
temp.clear()
temp = {
    key: excel_read[key]
    for key in ('rule_type', 'dimension')
}
output_rules = (temp | output_rules)
temp.clear()
# print("The output is:" ,output)
temp[excel_read['rules']] = output_rules
output_rules = temp.copy()
temp.clear()
temp['rules'] = output_rules
output_rules = temp.copy()
temp.clear()

print(literal_str.__name__)

str_rep = str(output_rules['rules'][excel_read['rules']]['params']['pattern'])
print(str_rep.replace(str_rep,f'literal_str("{str_rep}")'))
newstr = str_rep.replace(str_rep,f'{literal_str.__name__}("{str_rep}")')
output_rules['rules'][excel_read['rules']]['params']['pattern'] = newstr
print(output_rules)
解决方案

你当前的核心问题是用字符串拼接生成了literal_str的调用文本,而不是直接创建类实例。不需要用字符串替换的方式,直接用Excel读取到的pattern值实例化literal_str即可。

修改后的关键代码

替换原来最后一段的字符串处理逻辑:

# 直接用Excel读取的pattern值创建literal_str实例
pattern_value = excel_read['pattern']
output_rules['rules'][excel_read['rules']]['params']['pattern'] = literal_str(pattern_value)
print(output_rules)

额外优化:简化字典构建逻辑

你之前的字典构建过程过于繁琐,可以简化成直接嵌套的字典字面量,减少临时变量和copy操作,降低出错概率:

# 简化后的字典构建逻辑
rule_key = excel_read['rules']
output_rules = {
    'rules': {
        rule_key: {
            'rule_type': excel_read['rule_type'],
            'dimension': excel_read['dimension'],
            'params': {
                'pattern': literal_str(excel_read['pattern'])
            }
        }
    }
}
print(output_rules)

解释

  • 原来的代码通过字符串拼接生成的是'literal_str("^[0-9]+$")',这只是一个普通字符串,不是literal_str类的实例。
  • 直接调用literal_str(pattern_value)会创建真正的类实例,完全符合预期输出的格式要求。

内容的提问来源于stack exchange,提问作者RoxaneFelton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:01:05