【问题标题】:Django CSV Export.. Iterating inside a listDjango CSV Export.. 在列表中迭代
【发布时间】:2012-03-07 14:41:06
【问题描述】:

我正在查看 django 文档,了解如何将我的数据导出到 CSV 文件,以便可以将其导入到 excel 中。到目前为止,我得到了它的工作,但我在弄清楚如何在我的模型中导出 ManyToMany 字段时遇到了一些麻烦。

目前为止

writer = csv.writer(response)
writer.writerow(['A','B', 'C', 'D'])

    for x in case_log_list:
        writer.writerow([x.A,
                x.B,
                for y in x.C.all:
                    y,
                x.D)

[list] 中的 for 循环是我试图迭代该字段中的 ManyToMany 对象的地方。但是我不断收到一个没有任何意义的语法错误..我是否正确地处理了这个?

【问题讨论】:

  • 请说明您遇到的语法错误。 (复制并粘贴 Python 会话中的整个错误。)

标签: python django excel csv export


【解决方案1】:
  1. 您的列表定义中缺少终止 ]
  2. 您不能将 for 循环放在列表中。

x.C 是某种列表或序列吗?您是否打算将 x.C 的每个项目写为 CSV 中的单独字段?

我相信您打算使用列表连接运算符+,它接受两个列表并将它们粘合到一个列表中。像这样使用它:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]

你的例子变成了:

for x in case_log_list:
    c_list = [item for item in x.C.all]          # turn x.C into a list
    output_list = [x.A, x.B] + c_list + [x.D,]   # assemble list
    writer.writerow( output_list )

或者,如果您想简洁:

for x in case_log_list:
    writer.writerow ( [x.A, x.B] + [item for item in x.C.all] + [x.D,] )

注意事项:

  • 如果x.C.all 已经是一个列表——也就是说,如果type(x.C.all) is listTrue——那么[x.A, x.B] + x.C.all + [x.D,] 就足够了。

  • c_list = [item for item in x.C.all] 是一个列表推导式,它让您无需编写for 循环即可对列表执行操作。

    列表推导非常强大,非常优雅,您应该在任何有意义的地方使用它们。任何时候您需要根据另一个列表创建一个列表,根据某些条件过滤列表中的项目,或者同时满足这两种条件,列表推导式可能是一个不错的选择。

  • xABCD 这样的单字母变量名称真的很糟糕,因为它们没有提供有关变量包含什么数据、它的类型可能是什么的信息是,它可能包含什么值等。如果可以,请使用更具描述性的变量名称。

【讨论】:

    【解决方案2】:

    在将数据插入 csv 之前,您必须先创建数据。

    您可以在对其进行写入操作之前获取所有写入数据。

    mydata = [x.A,x.B]
    
    mydata += [y for y in x.C.all]
    mydata.append(x.D)
    # write mydata to the csv.
    

    这样你就可以得到数据并直接写入csv。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 2022-01-12
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多