将数组转换为CSV,包括多行imag

2024-05-13 00:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个数组转换成csv,这样我就可以快速地将项目导入Shopify。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的输出行顶部如下(必须“runsnippet”才能视为表)-请注意,我并不是要创建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>

Tags: httpscomgooglecdntgfilesclasstd
1条回答
网友
1楼 · 发布于 2024-05-13 00:31:16

这并不特别难。您的代码几乎是正确的(假设列是按您想要的方式排列的,并且假设您传入了有效的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就是这样csv.writer将单元格留空,所以将它们用作所有其他列的占位符。你知道吗

如果这需要很容易修改,我会推荐一种不同的方法。不过,这看起来像是一个一次性的转换脚本,所以一个快速、简单的黑客程序可以很好地工作。你知道吗

注意事项:

  • a if b else c,如果b求值为True,则表示a;如果求值为False,则表示c。你知道吗
  • ary.pop(n)ary弹出(删除并返回)索引n处的对象。你知道吗
  • 空数组的计算结果为False(因此我只测试images,而不是len(images) == 0
  • 您可能还需要更新标题。我只是按原样对它们进行了修改,所以我只对最后一个while进行了更改;您可能需要修复它们以准确地标记列。你知道吗

相关问题 更多 >