Python 将阵列转换为CSV,包括多行图像
我正在将一个数组转换为csv,这样我就可以将项目快速导入Shopify,导入时,必须执行以下操作才能添加多个图像:Python 将阵列转换为CSV,包括多行图像,python,csv,shopify,json2csv,Python,Csv,Shopify,Json2csv,我正在将一个数组转换为csv,这样我就可以将项目快速导入Shopify,导入时,必须执行以下操作才能添加多个图像: 插入新行(每张图片一行) 复制+粘贴“句柄” 复制并粘贴图像URL 因此,第一个图像位于第一行,所有后续图像位于下面的行中。示例CSV位于此处: 因此,我想编写一个程序,在一个数组中循环,它看起来像下面的数组(长得多的除外),并将其转换为CSV,将除第一个之外的所有照片放入一个新行 var array = [ { "brief": "Brief 1", "des
var array = [
{
"brief": "Brief 1",
"description": "Description 1",
"photos": [
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example.jpg?0101010101010",
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example2.jpg?0101010101010",
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example3.jpg?0101010101010"
],
"price": "145",
"tags": [
"tag1",
"tag2",
"tag3"
],
"title": "Title 1"
},
{
"brief": "Brief 2",
"description": "Description 2",
"photos": [
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example4.jpg?0101010101010",
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example5.jpg?0101010101010"
],
"price": "150",
"tags": [
"tag4",
"tag5",
"tag6",
"tag7",
"tag8",
],
"title": "Title 2"
}
]
我通常使用,这看起来像下面的东西,只是我不确定如何处理多行方面
json2csv -i data_in.json -f title,description,price,etc -o data_out.csv
Python也可能是一个不错的选择,如下所示,但多行方面同样令人困惑:
import csv
import json
x = """[
{
"brief": "Brief 1",
"description": "Description 1",
"photos": [
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example.jpg?0101010101010",
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example2.jpg?0101010101010",
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example3.jpg?0101010101010"
],
"price": "145",
"tags": [
"tag1",
"tag2",
"tag3"
],
"title": "Title 1"
},
{
"brief": "Brief 2",
"description": "Description 2",
"photos": [
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example4.jpg?0101010101010",
"https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example5.jpg?0101010101010"
],
"price": "150",
"tags": [
"tag4",
"tag5",
"tag6",
"tag7",
"tag8",
],
"title": "Title 2"
}
]"""
x = json.loads(x)
f = csv.writer(open("example.csv", "wb+"))
# Write CSV Header, If you dont need that, remove this line
f.writerow(["title", "description", "price"])
for x in x:
f.writerow([x["title"],
x["description"],
x["price"])
CSV的输出行顶部如下所示(必须“运行代码段”才能查看为表)-请注意,我不是在尝试创建HTML表:
.tg{边框折叠:折叠;边框间距:0;}
.tg td{字体系列:Arial,无衬线;字体大小:14px;填充:10px 5px;边框样式:实心;边框宽度:1px;溢出:隐藏;分词:正常;边框颜色:黑色;}
.tg th{字体系列:Arial,无衬线;字体大小:14px;字体大小:正常;填充:10px 5px;边框样式:实心;边框宽度:1px;溢出:隐藏;分词:正常;边框颜色:黑色;}
.tg.tg-yw4l{垂直对齐:顶部}
手柄
标题
正文(HTML)
小贩
类型
标签
出版
选项1名称
选项1值
选项2名称
选项2值
选项3名称
选项3值
变型SKU
变异克
变型库存跟踪器
可变库存量
可变库存策略
变体履行服务
变价
比价
变体需要运输
变型应纳税
变异条码
图像源
图像替换文本
礼品卡
谷歌购物/MPN
谷歌购物/年龄组
谷歌购物/性别
谷歌购物/谷歌产品分类
搜索引擎优化标题
搜索引擎优化描述
谷歌购物/广告词分组
谷歌购物/广告词标签
谷歌购物/条件
谷歌购物/定制产品
谷歌购物/自定义标签0
谷歌购物/定制标签1
谷歌购物/定制标签2
谷歌购物/定制标签3
谷歌购物/定制标签4
变异图像
可变重量单位
标题1
标题1
说明1
厂商名称
产品类型
tag1、tag2、tag3
真的
标题1
默认标题
1.
否认
手册
145
真的
真的
https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example.jpg?0101010101010
标题1
https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example2.jpg?0101010101010
标题1
https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example3.jpg?0101010101010
这并不特别难。您的代码几乎是正确的(假设列是按您希望的方式排列的,并且假设您传入了有效的JSON,因为您的代码中有一个额外的逗号),您只需要添加一点:
for x in x:
images = x["photos"]
f.writerow([x["title"],
x["description"],
x["price"],
images.pop(0) if images else None])
while images:
f.writerow([None, None, None, images.pop(0)])
简而言之,这样做的目的是按顺序循环所有图像,并将它们打印到新的空行中。在原始代码上运行它,example.csv
的结果如下:
title,description,price
Title 1,Description 1,145,https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example.jpg?0101010101010
,,,https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example2.jpg?0101010101010
,,,https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example3.jpg?0101010101010
Title 2,Description 2,150,https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example4.jpg?0101010101010
,,,https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example5.jpg?0101010101010
如何将内容放入不同的列中应该是非常明显的,None
s就是这样csv。writer
将单元格保留为空,因此将它们用作所有其他列的占位符
如果这需要易于修改,我会推荐一种不同的方法。不过,这看起来像是一个一次性的转换脚本,所以一个快速、简单的破解就可以了
请注意:
,如果a如果b否则c
计算为b
,则表示True
;如果计算结果为a
,则表示False
c
pop(删除并返回)索引ari.pop(n)
中的对象n
- 空数组的计算结果为
(因此我只测试False
,而不是images
)len(images)==0
- 您可能还需要更新标题。我只是照原样处理它们,所以我唯一的更改是最后一个
,而
;您可能需要修复它们以准确地标记列