当为CSV编写数据文件时,如何将字符串列表输出为JSON数组
例如,['foo', 'bar']应该是["foo", "bar"]
背景
我正在将数据从AWS上的PostgreSQL DB复制到AWS。作为中间步骤,必须将数据上传到CSV文件中的AWS S3。
但是Redshift不支持数组作为数据类型。数组需要转换为表示JSON数组的varchar。
例如,RDS上的character varying(255)[]类型列需要一个类型为character varying(MAX)的列,例如Redshift上的character varying(MAX),并使用JSON函数与数据进行交互。
如果数据没有作为JSON数组加载到Redshift中,则它将无效。
json_arrays | is_valid_json_array
------------------------------+---------------------
[] | T
["a","b"] | T
["a",["b",1,["c",2,3,null]]] | T
{"a":1} | F
a | F
{foo, bar} | F
{"one", "two"} | F
[x,y,z] | F
[1,2,] | F
['x','y','z'] | F棘手的部分是Python在内部用单引号表示字符串,所以当您将字符串列表写入CSV时,该列表将使用单引号,这不是一个有效的JSON数组。
一种不成功的方法是在读取CSV时转换数组。
def convert_pg_array_to_json_array(a):
"""
Converts a PG array such as '{foo,bar}' to '["foo", "bar"]'
"""
return json.dumps(a[1:-1].split(','))
# The arrays to convert are in column 20
df = pandas.read_csv(path, converters={20: convert_pg_array_to_json_array})
# Array gets output as "[""foo"", ""bar""]" which is not a valid JSON array
# Desired output is ["foo", "bar"]
df.to_csv(path)发布于 2018-08-21 12:08:59
在编写CSV时,将问题中的方法与这些更改结合起来:
配置转义字符(通常是反斜杠\)并禁用双重引用。
df.to_csv(path, escapechar="\\", doublequote=False)CSV中的行将类似于[\"foo\", \"bar\"],如果加载带有转义反斜杠的数据,它将是一个有效的JSON。对于Redshift COPY FROM,需要将ESCAPE选项添加到查询中。
https://stackoverflow.com/questions/51947586
复制相似问题