【问题标题】:Python encoding problems: zip csv buffers (Django)Python 编码问题:zip csv 缓冲区 (Django)
【发布时间】:2017-12-04 16:12:52
【问题描述】:

在 Django 视图中,我想在内存中创建一些 csv 文件,然后将它们压缩以下载。

我正在使用 Django 1.11 / Python 2.7。我的代码:

import csv
import zipfile
import StringIO


files = []

csv_buffer = StringIO.StringIO()
writer = csv.writer(csv_buffer)
writer.writerow(["val1", "str1"])

csv_buffer.seek(0)

files.append(csv_buffer)

zipped_file = StringIO.StringIO()

with zipfile.ZipFile(zipped_file, 'w') as zipper:
    for i, file in enumerate(files):
        file.seek(0)
        zipper.writestr("{}.csv".format(i), file.read())

zipped_file.seek(0)

# response = HttpResponse(csv_buffer, content_type='text/csv')
# response['Content-Disposition'] = 'attachment; filename=results.csv'
response = HttpResponse(zipped_file, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=results.zip'
return response

使用此代码,csv 编码为 utf-8,但我的编辑器抱怨“无效字符”。

如果我只返回 csv 文件,我会得到一个空的 csv。不知道为什么..

我认为 StringIO 缓冲区的编码错误,但我不知道如何使这项工作。如果我这样做:

csv_buffer = StringIO.StringIO("")

我可以创建一个可读的 CSV 文件,但是代码的 zip 部分失败了:

    'ascii' codec can't decode byte 0xd4 in position 10: ordinal not in range(128)

任何解释这里出了什么问题将不胜感激!

编辑: 错字 编辑 2: 添加了 zip 错误消息

【问题讨论】:

    标签: python django python-2.7 csv


    【解决方案1】:

    代替StringIO,使用BytesIO 作为ZipFile 的writestr 将尝试将第二个参数转换为字节。

    from io import BytesIO
    zipped_file = BytesIO
    
    with zipfile.ZipFile(zipped_file, 'w') as zipper:
        for i, myfile in enumerate(files):
            zipper.writestr("{}.csv".format(i), myfile.getvalue())
    
    zipped_file.seek(0)
    

    我还有额外的两分钱是:

    • 不要使用file 作为变量名。这是一个 python 模块。
    • 您可以使用getvalue,这样您就不必每次都重置seek(0)

    【讨论】:

    • 感谢您的回答,但如果 myfile = StringIO("") 我收到错误消息:StringIO 实例没有属性“getValue”。如果 myfile = StringIO(),则压缩有效,但 csv 文件不可读..
    【解决方案2】:

    我通过使用 ZipInfo 方法在 zip 中明确定义 csv 的文件名来解决它,如下所示:

    zipinfo = zipfile.ZipInfo("{}.csv".format(i))
    zipper.writestr(zipinfo, myfile.read())
    

    而且奇迹般地奏效了!可能与 zipfile 不支持 UTF 文件名有关。但它不会抛出错误,而是会弄乱压缩文件本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多