【问题标题】:Converting string with `\` into json or dictionary data将带有 `\` 的字符串转换为 json 或字典数据
【发布时间】:2019-06-16 11:56:59
【问题描述】:

我有一个csv列数据,上学期的TA说我们可以导出和导入为json。

"""[
    {\""type\"": \""account\"", \""data\"": {\""bid\"": 12, \""acc_num\"": 22}}, 
    {\""type\"": \""card\"", \""data\"": {\""card_num\"": 85}}
]"""

与他所说的不同,我无法在 Postgres 中使用 json 类型导入它。但我可以将其导入为character varying 或text 类型。在这两种情况下,数据都被提取到一个 python 字符串中,如下所示。

[
    {\type\: \account\, \data\: {\bid\: 12, \acc_num\: 22}},
    {\type\: \card\, \data\: {\card_num\: 85}}
]

鉴于其原始形式,您认为将其转换为 python 数据或 json 数据的一种有效且有效的方法是什么?我试过了

1) 使用.replace("\\",'\"') 将\ 转换为":效果不佳,因为有\t 和\b 之类的东西。

2) json.loads(string) : json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: 错误。知道我不能这样做,因为它不是正确的 json 格式,但我尝试了。

编辑) csv 文件中的一行

姓名、电话、本地、域、密码、付款、纬度、lng

Daivd,01095434668,tfalkc,smh.com.au,8mf3trl,"""[{\""type\"": \""account\"", \""data\"": {\""bid\"": 12, \""acc_num\"": 710831175086172}}, {\""type\"": \""card\"", \""data\"": {\""card_num\"": 8543466885434668}}, {\""type\"": \""card\"", \""data\"": {\""card_num\"": 1221510412215104}}, {\""type\"": \""card\"", \""data\"": {\""card_num\"": 4871213148712131}}]""",37.6274,126.98167 

【问题讨论】:

  • 你确定这是输入吗?我们可以从csv获取样本数据
  • @Vishnudev 第一个是我直接从该特定列数据中复制粘贴的内容(尽管通过多行传播)
  • 请显示 csv 文件中的一行。顺便说一句,谁构建了该 csv 文件以及如何构建的?
  • @SergeBallesta 从 CSV 文件中添加了一行。是助教,据我所知,这是一个垃圾数据,只是为了我们可以练习......

标签: python json postgresql


【解决方案1】:

这是从您发布的内容中获取有效 Python 对象的一种方式,但我认为可能有更简洁且不易出错的方式。之后,您可以json.dumps()将结果存储起来。

from ast import literal_eval

a = """[
    {\""type\"": \""account\"", \""data\"": {\""bid\"": 12, \""acc_num\"": 22}}, 
    {\""type\"": \""card\"", \""data\"": {\""card_num\"": 85}}
]"""

a = literal_eval(a.replace('\""', '"'))

【讨论】:

  • 有点开放的挑战;我对这种方法感到不安,并觉得它可以通过以这种方式转义的有效输入文本被破坏,但我没有看到它或更好的前进方式。打破这个会教给我一些东西。
【解决方案2】:

您可以通过csv 模块加载 csv(或者使用 pandas,即使它在这里也可能是矫枉过正)。只是该字段的格式不正确,您必须使用literal_eval unwrap 它,但它是一个有效的 json 字符串:

with open('file.csv') as fd:
    rd = csv.DictReader(fd)
    line = next(rd)   # only read first line here ; loop if you want to read more...
    line = ast.literal_eval(line)
    data = json.loads(line)

它按预期给出:

[{'data': {'acc_num': 710831175086172, 'bid': 12}, 'type': 'account'},
 {'data': {'card_num': 8543466885434668}, 'type': 'card'},
 {'data': {'card_num': 1221510412215104}, 'type': 'card'},
 {'data': {'card_num': 4871213148712131}, 'type': 'card'}]

注意:此代码处理问题编辑中给出的示例 csv 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2017-11-27
    • 1970-01-01
    • 2021-04-10
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多