我有一个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
之类的东西。 / p>
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
答案 0 :(得分:4)
这是从您发布的内容中获取有效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('\""', '"'))
答案 1 :(得分:1)
您可以通过csv
模块加载csv(或者使用pandas加载csv,在这里它可能是多余的)。只是该字段的格式不正确,您将不得不使用literal_eval
wrap 对其进行包装,但这是一个有效的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行。