首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据写入CSV,其中列表被转换为JSON数组

将数据写入CSV,其中列表被转换为JSON数组
EN

Stack Overflow用户
提问于 2018-08-21 11:21:38
回答 1查看 421关注 0票数 2

为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中,则它将无效。

代码语言:javascript
复制
         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时转换数组。

代码语言:javascript
复制
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)
EN

Stack Overflow用户

发布于 2018-08-21 12:08:59

在编写CSV时,将问题中的方法与这些更改结合起来:

配置转义字符(通常是反斜杠\)并禁用双重引用。

代码语言:javascript
复制
df.to_csv(path, escapechar="\\", doublequote=False)

CSV中的行将类似于[\"foo\", \"bar\"],如果加载带有转义反斜杠的数据,它将是一个有效的JSON。对于Redshift COPY FROM,需要将ESCAPE选项添加到查询中。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51947586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档