Amazon AWS Data Pipeline 提供 CSV 文件作为 MySQL 数据库的输出。在 CSV 中,有一个包含 JSON 的字段,我们尝试分别使用 Python 的内置 CSV 和 JSON 读取器来提取和解码该字段。但是,由于 CSV 的生成方式,JSON 不以引号开头,并且 CSV 解析器仅返回该 CSV 字段的 JSON 中的第一个“{”。
我们认为 CSV 读取器会看到第一个“{”,然后会看到一个换行符,它将其解释为 CSV 行的末尾。如果 JSON 用引号引起来,则该脚本可以正常工作。请参阅以下代码:
with open(args.env_vars[0] + '/click_stream_source.csv', 'r') as csvFile:
csvReader = csv.reader(csvFile, delimiter = ',')
with open(args.env_vars[1] + '/clickstream_target.csv', 'wb') as csvTarget:
csvWriter = csv.writer(csvTarget, delimiter = ',')
for row in csvReader:
json_data = json.loads(row[5])
示例 CSV 为:
495019,,8239,E3728E7D480248AA2EB5D5BB5C467737,67.84.254.6,{
""requests"": [
{
""queryString"": null,
""time"": ""2013-06-14T11:53:40Z"",
""userAgent"": ""Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"",
""requestURI"": ""/xxxxx/xxxx/xxxx.xxxxxxx"",
""class"": ""xxxxx"",
""params"": {
""action"": ""xxxxx"",
""controller"": ""xxxx""
},
""isAjaxRequest"": false
}]}
我们得到一个
ValueError: Expecting Object ...
其中json.loads()方法
最佳答案
我认为从技术上讲你不能调用这个 CSV,因为它违反了解析规则,但我并不是想迂腐,我想说这是放弃内置解析工具并走老派的一个原因,制作一个有限状态机。这是一个简单的示例,您可以根据自己的目的进行调整。
#!/usr/bin/env python
import re
import json
def fix_and_parse(gathered_lines):
strJson = '{' + "\n".join(gathered_lines)
strJson = strJson.replace('""', '"')
return json.loads(strJson)
state = 0
with open('csvFile', 'r') as csvFile:
gathered_lines = []
for line in csvFile:
if re.search('^\d', line):
if gathered_lines:
print json.dumps(fix_and_parse(gathered_lines), indent=4)
state = 0
gathered_lines = []
else:
state = 1
if state == 1:
gathered_lines.append(line)
print json.dumps(fix_and_parse(gathered_lines), indent=4)
关于Python CSV Reader 仅限 JSON 的第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118587/