代码之家  ›  专栏  ›  技术社区  ›  maudulus

将数组转换为包含多行图像的csv

  •  3
  • maudulus  · 技术社区  · 7 年前

    我正在将数组转换为csv,以便快速导入项目进行购物。 According to Shopify ,导入时必须执行以下操作以添加多个图像:

    1. 插入新行(每张图片一行)。
    2. 复制并粘贴“手柄”。
    3. 复制+粘贴图像URL。

    因此,第一个图像放在第一行,所有后续图像放在下面的行中。示例csv位于此处: https://help.shopify.com/csv/product_template.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 它看起来像下面这样,只是我不知道如何处理多行方面。

    json2csv -i data_in.json -f title,description,price,etc -o data_out.csv
    

    python也可能是一个不错的选择,如下所示 this post 但同样,多行方面令人困惑:

    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表:

    <style type="text/css">
    .tg  {border-collapse:collapse;border-spacing:0;}
    .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
    .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
    .tg .tg-yw4l{vertical-align:top}
    </style>
    <table class="tg">
      <tr>
        <th class="tg-yw4l">Handle</th>
        <th class="tg-yw4l">Title</th>
        <th class="tg-yw4l">Body (HTML)</th>
        <th class="tg-yw4l">Vendor</th>
        <th class="tg-yw4l">Type</th>
        <th class="tg-yw4l">Tags</th>
        <th class="tg-yw4l">Published</th>
        <th class="tg-yw4l">Option1 Name</th>
        <th class="tg-yw4l">Option1 Value</th>
        <th class="tg-yw4l">Option2 Name</th>
        <th class="tg-yw4l">Option2 Value</th>
        <th class="tg-yw4l">Option3 Name</th>
        <th class="tg-yw4l">Option3 Value</th>
        <th class="tg-yw4l">Variant SKU</th>
        <th class="tg-yw4l">Variant Grams</th>
        <th class="tg-yw4l">Variant Inventory Tracker</th>
        <th class="tg-yw4l">Variant Inventory Qty</th>
        <th class="tg-yw4l">Variant Inventory Policy</th>
        <th class="tg-yw4l">Variant Fulfillment Service</th>
        <th class="tg-yw4l">Variant Price</th>
        <th class="tg-yw4l">Variant Compare At Price</th>
        <th class="tg-yw4l">Variant Requires Shipping</th>
        <th class="tg-yw4l">Variant Taxable</th>
        <th class="tg-yw4l">Variant Barcode</th>
        <th class="tg-yw4l">Image Src</th>
        <th class="tg-yw4l">Image Alt Text</th>
        <th class="tg-yw4l">Gift Card</th>
        <th class="tg-yw4l">Google Shopping / MPN</th>
        <th class="tg-yw4l">Google Shopping / Age Group</th>
        <th class="tg-yw4l">Google Shopping / Gender</th>
        <th class="tg-yw4l">Google Shopping / Google Product Category</th>
        <th class="tg-yw4l">SEO Title</th>
        <th class="tg-yw4l">SEO Description</th>
        <th class="tg-yw4l">Google Shopping / AdWords Grouping</th>
        <th class="tg-yw4l">Google Shopping / AdWords Labels</th>
        <th class="tg-yw4l">Google Shopping / Condition</th>
        <th class="tg-yw4l">Google Shopping / Custom Product</th>
        <th class="tg-yw4l">Google Shopping / Custom Label 0</th>
        <th class="tg-yw4l">Google Shopping / Custom Label 1</th>
        <th class="tg-yw4l">Google Shopping / Custom Label 2</th>
        <th class="tg-yw4l">Google Shopping / Custom Label 3</th>
        <th class="tg-yw4l">Google Shopping / Custom Label 4</th>
        <th class="tg-yw4l">Variant Image</th>
        <th class="tg-yw4l">Variant Weight Unit</th>
        <th class="tg-yw4l"></th>
        <th class="tg-yw4l"></th>
      </tr>
      <tr>
        <td class="tg-yw4l">Title 1</td>
        <td class="tg-yw4l">Title 1</td>
        <td class="tg-yw4l">Description 1</td>
        <td class="tg-yw4l">Vendor Name</td>
        <td class="tg-yw4l">Product Type</td>
        <td class="tg-yw4l">"tag1,tag2,tag3"</td>
        <td class="tg-yw4l">TRUE</td>
        <td class="tg-yw4l">Title 1</td>
        <td class="tg-yw4l">Default Title</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l">1</td>
        <td class="tg-yw4l">deny</td>
        <td class="tg-yw4l">manual</td>
        <td class="tg-yw4l">145</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l">TRUE</td>
        <td class="tg-yw4l">TRUE</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l">https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example.jpg?0101010101010</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
      </tr>
      <tr>
        <td class="tg-yw4l">Title 1</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l">https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example2.jpg?0101010101010</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
      </tr>
      <tr>
        <td class="tg-yw4l">Title 1</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l">https://cdn.shopify.com/s/files/1/01/01/01/files/imgs-example3.jpg?0101010101010</td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
        <td class="tg-yw4l"></td>
      </tr>
    </table>
    1 回复  |  直到 7 年前
        1
  •  1
  •   Nic Jonatan Kaźmierczak    7 年前

    这并不难。您的代码几乎是正确的(假设列是按您想要的方式排列的,并且假设您在中传递了有效的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 if b else c 如果 b 计算结果为 True a False c
    • ary.pop(n) n ary
    • images len(images) == 0
    • while