在flask应用程序中提供pandas数据帧的Zip文件

2024-09-30 12:29:31 发布

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

我试图在我的Flask应用程序中返回一个pandas数据帧的zip。我有一个视图返回serve\u csv函数的输出。这是我原来的serve_csv函数,它成功地下载了一个指定的csv。在

def serve_csv(dataframe,filename):
    buffer = StringIO.StringIO()
    dataframe.to_csv(buffer, encoding='utf-8', index=False)
    buffer.seek(0)
    return send_file(buffer,
         attachment_filename=filename,
         mimetype='text/csv')

我试图将其更改为一个serve_zip函数,该函数接受pandas数据帧的列表并返回相应csv文件的zip。但是,我收到一个错误,它指出Nonetype类型的对象没有len。我猜这与我试图写入缓冲区的方式有关,但是在阅读了文档之后,不确定如何修复它。以下是我当前的职能:

^{pr2}$

我的堆栈跟踪:

Full traceback: 
127.0.0.1 - - [17/Feb/2015 15:57:21] "POST /part2/ HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/.deps/Flask-0.10.1-py2.7.egg/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/webapp.py", line 110, in part2
return serve_zip([table3, agg_table], 'my_file.csv')
  File "/private/var/folders/f4/qr09tm_169n4b9xyjsrjv8680000gn/T/tmpmQ95cJ/webapp.py", line 61, in serve_csv
zip.writestr(filename, dataframe.to_csv(zipped_file, encoding='utf-8', index=False))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 1216, in writestr
zinfo.file_size = len(bytes)            # Uncompressed size
TypeError: object of type 'NoneType' has no len()
127.0.0.1 - - [17/Feb/2015 15:57:21] code 400, message Bad request version ('RTSP/1.0')
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /info?txtAirPlay&txtRAOP RTSP/1.0" 400 -
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /part2/?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 200 -
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /part2/?__debugger__=yes&cmd=resource&f=jquery.js HTTP/1.1" 200 -
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /part2/?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 200 -
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /part2/?__debugger__=yes&cmd=resource&f=ubuntu.ttf HTTP/1.1" 200 -
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /part2/?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /part2/?__debugger__=yes&cmd=resource&f=source.png HTTP/1.1" 200 -
127.0.0.1 - - [17/Feb/2015 15:57:21] "GET /part2/?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -

Tags: csvinpyappflaskvarlineprivate
1条回答
网友
1楼 · 发布于 2024-09-30 12:29:31

如果提供了缓冲区对象,dataframe.to_csv似乎不返回字符串,而是将CSV数据写入缓冲区。无论如何,这不是您想要的,因为您希望缓冲区中的数据是有效的zip文件。相反,请传入None

zip.writestr(filename, dataframe.to_csv(None, encoding='utf-8', index=False))

这样zip对象将压缩CSV字符串并将其添加到zip存档(您通过StringIO在内存中缓冲该文件)。在

相关问题 更多 >

    热门问题