python自定义json转换表JSONEncoder csv到json

时间:2018-10-05 13:17:54

标签: python json elasticsearch

我正在尝试将CS​​V转换为json以供Elasticsearch使用。 这是一个示例csv:

user,user_creation_time UserName1,2018-02-21T15:57:53+00:00 UserName2,N/A

数组类型:user-str

user_creation_time-ISO时间或str('N/A')
问题在于,ElasticSearch接收值N/A失败,因为它期望类型为date

我有更多的时间字段与此问题有关(一旦它是日期,则为字符串)。实现此目标的最佳方法是什么?

最后,功能应类似于:

csv

user,user_creation_time UserName1,2018-02-21T15:57:53+00:00 UserName2,N/A

python

{"user":"UserName1","user_creation_time":"2018-02-21T15:57:53+00:00"} {"user":"UserName2","user_creation_time":None}

json

{"user":"UserName1","user_creation_time":"2018-02-21T15:57:53+00:00"} {"user":"UserName2","user_creation_time":null}

我现在要做的是:

import csv

with open(csv_file, 'r') as inf:
    reader = csv.DictReader(inf.readlines())

print(json.dumps(tuple(reader)))

1 个答案:

答案 0 :(得分:0)

我最终做了与@stovfl建议的相同的操作。 并创建了此https://gist.github.com/1oglop1/9950b033dc655f675ebc11ac122ab815

另一个肮脏的解决方案是替换字符串中的值,将其转换为json,将json转储为字符串,替换不同的值并在再次加载时获得正确的结构

with open(csv_file, 'r') as inf:
    file_content = inf.read()

no_na = file_content.replace('N/A', '').replace('not_supported', '')
rdr = csv.DictReader(no_na.splitlines())
records = json.dumps(tuple(rdr))
fixed_json = records.replace('""', "null").replace('"false"', "false").replace("'true'", "true")
print('jsn',records)
print(fixed_json)
print(json.loads(fixed_json))  # correct dict