【问题标题】:csv writer, adding list items to end of rowcsv writer,将列表项添加到行尾
【发布时间】:2017-05-26 02:37:41
【问题描述】:

我正在尝试解析大量数据以自动创建此报告。除了 JSON 数据每个项目都有一个标签列表外,我大部分时间都在工作。它们嵌套在每个“任务项”中。

我希望 csv 看起来像这样

Name,Title,Description,Priority,Tag1, Tag2, Tag3, Tag4

下面的代码可以工作,除了因为 json 数据中的标签像嵌套一样

tags: [
{
id: 56131,
name: "NotNeeded",
color: "#a6a6a6"
},
{
id: 60598,
name: "Other",
color: "#f47fbe"
},
{
id: 60493,
name: "Test",
color: "#2f8de4"
}

我只想要标签,而不想要其他东西。我希望在每一行的末尾添加每个标签。有些有三个标签,有些有一个等等。我只是想让它们现在写,但是使用这段代码,它们都打印在第 1 列的新行上。

除此之外,我还想在其中构建一个 if 语句来确定它位于哪个标签标题下...例如 if name = "Other" put under header Tag3

with open('test.csv', 'w', newline='') as csvfile:
 csvwriter = csv.writer(csvfile, lineterminator='\n')
 csvwriter.writerow(["Name", "Title", "Description", "priority", "tags"])
 for each in jdata['todo-items']:
  csvwriter.writerow([(each["todo-list-name"]),
   (each["content"]),
   (each["description"]),
   (each["priority"])])
  for tags in each['tags']:
   csvwriter.writerow([(tags["name"])])

编辑: 到目前为止,这按我想要的方式工作(除了标签在输出中周围有 ['Tag'] 。

with open('test.csv', 'w', newline='') as csvfile:
 csvwriter = csv.writer(csvfile, lineterminator='\n')
 csvwriter.writerow(["Name", "Title", "Description", "priority", "tags"])

 for each in jdata['todo-items']:
  write_list = [(each["todo-list-name"]),
   (each["content"]),
   (each["description"]),
   (each["priority"])]
  for tags in each['tags']:
   write_list.append([(tags["name"])])
  csvwriter.writerow(write_list)

【问题讨论】:

  • 您希望标签是单独的列,还是在同一列中?
  • 分开我认为最好,这样我以后可以在excel中应用过滤器。因此我希望他们匹配过滤器。如果名称是其他所有其他人应该在同一列。因为如果一个有 2 个标签,那么它可能有 NotNeeded、Other 和下一个只有一个标签,Other。如果没有 IF 语句,Other 将进入上一个 NotNeeded 下的第一列。
  • @CarverStone 您现在可以接受自己的答案

标签: python json python-3.x csv


【解决方案1】:

在写出之前构建列表。

with open('test.csv', 'w', newline='') as csvfile:
    csvwriter = csv.writer(csvfile, lineterminator='\n')
    csvwriter.writerow(["Name", "Title", "Description", "priority", "tags"])

    for each in jdata['todo-items']:
        write_list = [(each["todo-list-name"]),
                      (each["content"]),
                      (each["description"]),
                      (each["priority"])]

    for tags in each['tags']:
        write_list.append(tags["name"])

    csvwriter.writerow(write_list)

【讨论】:

  • 它有效.. 将标签放在最后的同一行中,但它会覆盖每个循环的 write_list 并且只将最终项目写入 csv。我应该将第一个循环中的 write_list = 更改为附加吗?
  • 不,它似乎没有......它实际上是从另一个项目中抓取标签并将其添加到末尾。所以它不是来自 json 数据中同一项目的标签。我会用我的意思更新问题
  • 我认为如果第二个 for 循环在第一个 for 循环内,它会起作用,但我无法弄清楚编写器内部的语法以使其工作。就像标签数据应该像它之前的每个键一样输入,优先级,desc 等......但不是只输入它看到的第一个,它需要循环嵌套数据并添加它看到的所有键值,然后再继续到“待办事项”中的下一个根项目
  • 是的..这需要我一点时间..我只从每件大约 100 个钥匙中取出几个钥匙。而且我需要更改数据,因为它是真实数据,我不能发布它。
  • 与此同时,我在问题中对其进行了第二次编辑,如果可以在那里嵌套一个 for 循环,我认为它会起作用。
【解决方案2】:

在编写之前嵌套第二个 for 循环并将其添加到列表中。 感谢@Seanny 的帮助。

with open('test.csv', 'w', newline='') as csvfile:
 csvwriter = csv.writer(csvfile, lineterminator='\n')
 csvwriter.writerow(["Name", "Title", "Description", "priority", "tags"])

 for each in jdata['todo-items']:
  write_list = [(each["todo-list-name"]),
   (each["content"]),
   (each["description"]),
   (each["priority"])]
  for tags in each['tags']:
   write_list.append([(tags["name"])])
  csvwriter.writerow(write_list)

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 2019-07-01
    • 2020-12-03
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多