【问题标题】:output csv with django用 django 输出 csv
【发布时间】:2012-11-24 10:30:57
【问题描述】:
def export_csv(request):
    response = HttpResponse(mimetype = 'text/csv')
    response['Content-Disposition'] = 'attachment; filename=exported.csv'
    writer = csv.writer(response)
    data = [['First-Name','Last-name'],['Foo','baar']]
    for entry in data:
            writer.writerow(entry)
    return response

以上代码是为从 django 输出 csv 文件而编写的。我面临的问题是导出/输出文件的内容没有显示在 csv 文件编辑器的不同框中。对于数据(列表)中的每个条目,它会打印在同一个框中,而不是应该在不同的框中解释每个条目的值(名字,姓氏)。

csv 文件中的实际结果:

|First-Name,Last-Name |
|Foor,bar             |

预期:

|First-Name |Last-Name |
|Foo        |Baar      |

如何获得独立于列表大小及其内容导出文件的机制?

【问题讨论】:

  • 您之前发布的文件实际上和我一模一样。要记住的一件事是 CSV 从字面上看只是逗号分隔的值(如您所见)。这实际上是您用来正确解释它的编辑器的工作(例如,当写入 CSV 并在 Excel 中打开时,我有时必须告诉它以逗号分隔)。
  • 是的,它按你说的那样工作,因为我用逗号分割文件,它显示了我预期的结果。我认为有一些方法可以在默认环境中显示预期结果,而不是说 csv 编辑器用逗号分割文件。
  • 如果您使用 Excel,请尝试创建像 writer = csv.writer(response, dialect='excel') 这样的编写器 - 这可能对您的情况有所帮助。
  • @Navid,这个 csv 文件保存在哪里?什么目录?我运行了您的代码,但找不到文件的保存位置。

标签: python django csv


【解决方案1】:

您可以使用自己的自定义分隔符等为 csv.writer 设置自己的方言:

class dia2(csv.Dialect):
    delimiter = '\t' # delimiter should be only 1-char
    quotechar = '"'
    escapechar = None
    doublequote = True
    skipinitialspace = False
    lineterminator = '\r\n'
    quoting = 1
writer = csv.writer(response, dialect=dia2)
...

不同编辑器不同行为问题的主要原因 - 您应该在每个编辑器本身中正确地将 CSV 分隔符设置为您真正使用的分隔符。另一个可能的原因 - 您没有对每个 CSV 值使用引号(即 quoting=1 在方言类中)。 根据您的预期输出,您还可以期待另一件事 - 每个字段的长度相同,其余部分填充空格 - 这是无法通过 csv 模块完成的,但是您可以使用将每个单元格的数据格式化为相同的长度标准的 Python 格式,例如:

data[i] = "%10s" % data[i]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多