Python 将阵列转换为CSV,包括多行图像

Python 将阵列转换为CSV,包括多行图像,python,csv,shopify,json2csv,Python,Csv,Shopify,Json2csv,我正在将一个数组转换为csv,这样我就可以将项目快速导入Shopify,导入时,必须执行以下操作才能添加多个图像: 插入新行(每张图片一行) 复制+粘贴“句柄” 复制并粘贴图像URL 因此,第一个图像位于第一行,所有后续图像位于下面的行中。示例CSV位于此处: 因此,我想编写一个程序,在一个数组中循环,它看起来像下面的数组(长得多的除外),并将其转换为CSV,将除第一个之外的所有照片放入一个新行 var array = [ { "brief": "Brief 1", "des

我正在将一个数组转换为csv,这样我就可以将项目快速导入Shopify,导入时,必须执行以下操作才能添加多个图像:

  • 插入新行(每张图片一行)
  • 复制+粘贴“句柄”
  • 复制并粘贴图像URL
  • 因此,第一个图像位于第一行,所有后续图像位于下面的行中。示例CSV位于此处:

    因此,我想编写一个程序,在一个数组中循环,它看起来像下面的数组(长得多的除外),并将其转换为CSV,将除第一个之外的所有照片放入一个新行

    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
    • ari.pop(n)
      pop(删除并返回)索引
      n
      中的对象
    • 空数组的计算结果为
      False
      (因此我只测试
      images
      ,而不是
      len(images)==0
    • 您可能还需要更新标题。我只是照原样处理它们,所以我唯一的更改是最后一个
      ,而
      ;您可能需要修复它们以准确地标记列