【问题标题】:Opening a file that has been uploaded in Flask打开已在 Flask 中上传的文件
【发布时间】:2017-02-12 05:36:28
【问题描述】:

我正在尝试修改上传到我的烧瓶应用程序的 csv。当我不通过烧瓶上传时,我的逻辑可以正常工作。

import pandas as pd
import StringIO
with open('example.csv') as f:
    data = f.read()

data = data.replace(',"', ",'")
data = data.replace('",', "',")
df = pd.read_csv(StringIO.StringIO(data), header=None, sep=',', quotechar="'")
print df.head(10)

我将它上传到烧瓶并使用

访问它
f = request.files['data_file']

当我通过上面的代码运行它时,将 open('example.csv') 替换为 open(f),我收到以下错误

coercing to Unicode: need string or buffer, FileStorage found

我发现问题出在此处的文件类型上。我不能在我的文件上使用 open,因为 open 正在寻找文件名,并且当文件上传到烧瓶时,它是传递给 open 命令的文件的实例。但是,我不知道如何使这项工作。我试过跳过 open 命令,只使用 data = f.read() 但这不起作用。有什么建议吗?

谢谢

【问题讨论】:

  • “我尝试跳过打开命令,只使用 data = f.read() 但这不起作用。”会发生什么?
  • 它只是创建一个没有任何信息的空白字符串。

标签: python flask


【解决方案1】:

FileStorage 是传入数据的类似文件的包装器。可以直接传给read_csv

pd.read_csv(request.files['data_file'])

您很可能不应该对数据执行那些 replace 调用,因为 CSV 模块应该处理这个问题,而天真的替换可能会损坏引用列中的数据。但是,如果您仍然需要,您可以像以前一样读取数据。

data = request.files['data_file'].read()

如果您的数据包含多种引用样式,则应修复数据来源。

【讨论】:

    【解决方案2】:

    回答我自己的问题以防其他人需要。

    FileStorage 对象有一个 .stream 属性,它是一个 io.BytesIO

    f  = request.files['data_file']
    df = pandas.read_csv(f.stream)
    

    【讨论】:

    • 这在我的情况下不起作用。在打印它显示的 f.stream 对象时 -
    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多