Python CSV Reader 仅限 JSON 的第一个字符

标签 python json csv

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/

相关文章:

javascript - 来自 localStorage 问题的 JSON.parse()

python - django.core.exceptions.ImproperlyConfigured : Set the DATABASE_URL environment variable

python - 在Python中动画射弹的路径

python - 如何在矩形上方而不是下方写入文本?

java - Mahout 朴素贝叶斯 CSV 分类

Python:如何在列表中查找与元素名称的一部分匹配的元素

mysql - 导入 CSV 文件时出现问题

python - 如何按行长度对 pandas 数据框进行排序

Android - 没有键的数组上的 JsonArray

javascript - ng-repeat PHP 变量