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

如何从OrderedDict生成带字符串转义的CSV格式字符串

问题解决:带单引号转义的CSV内容生成

报错原因

你的代码触发错误有两层原因:

  1. OrderedDict.values()返回的是odict_values集合视图对象,不属于字符串类型,无法直接调用encode方法,直接调用就会抛出你遇到的AttributeError
  2. 就算单独对每个值做unicode_escape转义,该规则和CSV要求的单引号转义规则(单引号替换为两个单引号)不一致,也达不到你期望的输出效果

解决方案

方案1:使用Python内置csv模块(推荐)

内置csv模块已经覆盖了所有CSV标准转义场景,不需要自己处理边界情况,适配性更强:

from collections import OrderedDict
import csv
import io

ordered_dict = OrderedDict({
  "hdr_1": "val_1",
  "hdr_2": "val '2'",
  "hdr_3": 3,
  "hdr_4": "val, 4"
})

# 构造内存缓冲区存储CSV内容
output = io.StringIO()
writer = csv.writer(
    output,
    delimiter=',', # 分隔符用逗号
    quotechar="'", # 包裹符用单引号
    quoting=csv.QUOTE_NONNUMERIC, # 仅非数值类型加包裹符
    doublequote=True # 自动把内容里的单引号转义为两个单引号
)
# 写入OrderedDict的值,需要先转为列表
writer.writerow(list(ordered_dict.values()))
# 去掉末尾自动追加的换行符
vals = output.getvalue().rstrip()
print(vals)

运行后输出正好符合你的预期:'val_1','val ''2''',3,'val, 4'

方案2:手动实现转义(适合简单场景)

如果你的使用场景非常简单,不需要处理换行、特殊符号等复杂情况,可以自己写轻量转义逻辑:

from collections import OrderedDict

ordered_dict = OrderedDict({
  "hdr_1": "val_1",
  "hdr_2": "val '2'",
  "hdr_3": 3,
  "hdr_4": "val, 4"
})

def escape_csv_val(val):
    if isinstance(val, str):
        # 字符串内部单引号转义为两个单引号,外层加单引号包裹
        return f"'{val.replace(\"'\", \"''\")}'"
    # 非字符串类型直接转为字符串输出
    return str(val)

vals = ','.join(escape_csv_val(v) for v in ordered_dict.values())
print(vals)

运行输出和方案1完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:45:03