【问题标题】:Read a Django UploadedFile into a pandas DataFrame将 Django UploadedFile 读入 pandas DataFrame
【发布时间】:2020-03-28 12:34:09
【问题描述】:

我正在尝试将上传到 Django 的 .csv 文件读入 DataFrame。

我正在遵循uploading files 的说明和 Django REST 框架页面。当我 PUT 一个 .csv 文件到定义的端点时,我最终得到一个 Django UploadedFile 对象,特别是 TemporaryUploadedFile

我正在尝试使用read_csv 将此对象读入熊猫数据框,但是,临时上传的文件周围还有其他格式。我想知道如何读取上传的原始 .csv 文件。

根据 DRF 文档,我已分配:

file_obj = request.data['file']

在 Python 调试控制台中,我看到了:

ipdb> file_obj                                                                                                                                                                            
<TemporaryUploadedFile: foobar.csv (multipart/form-data; boundary=--------------------------044608164241682586561733)>

到目前为止我尝试过的事情。

有了原始文件路径,我就可以这样读入pandas了。

dataframe = pd.read_csv(open("foobar.csv", "rb"))

但是,原始文件有 Django 在上传过程中添加的额外元数据。

ipdb> pd.read_csv(open(file_obj.temporary_file_path(), "rb"))                                                                                                                             
*** pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 5, saw 32

如果我尝试使用UploadedFile.read() 方法,我会遇到以下问题。

ipdb> dataframe = pd.read_csv(file_obj.read())                                                                                                                                            
*** OSError: Expected file path name or file-like object, got <class 'bytes'> type

谢谢!

附:原始文件的前几行如下所示。

SPID,SA_ID,UOM,DIR,DATE,RS,NAICS,APCT,1:00,2:00,3:00,4:00,5:00,6:00,7:00,8:00,9:00,10:00,11:00,12:00,13:00,14:00,15:00,16:00,17:00,18:00,19:00,20:00,21:00,22:00,23:00,0:00:00
(Blanked),123456789,KWH,R,5/2/18,H2ETOUAN,,100,0,0,0,0,0,0,0,0.144,1.064,3.07,4.531,4.013,5.205,4.751,4.647,3.142,2.464,1.173,0.023,0,0,0,0,0
(Blanked),123456789,KWH,R,3/10/18,H2ETOUAN,,100,0,0,0,0,0,0,0,0,0.007,0.622,0.179,0.003,0.274,0.167,0.014,0.004,0.028,0.139,0,0,0,0,0,0

当我查看临时文件的内容时,我看到了这个。

----------------------------789873173211443224653494
Content-Disposition: form-data; name="file"; filename="foobar.csv"
Content-Type: File

SPID,SA_ID,UOM,DIR,DATE,RS,NAICS,APCT,1:00,2:00,3:00,4:00,5:00,6:00,7:00,8:00,9:00,10:00,11:00,12:00,13:00,14:00,15:00,16:00,17:00,18:00,19:00,20:00,21:00,22:00,23:00,0:00:00
(Blanked),123456789,KWH,R,5/2/18,H2ETOUAN,,100,0,0,0,0,0,0,0,0.144,1.064,3.07,4.531,4.013,5.205,4.751,4.647,3.142,2.464,1.173,0.023,0,0,0,0,0
(Blanked),123456789,KWH,R,3/10/18,H2ETOUAN,,100,0,0,0,0,0,0,0,0,0.007,0.622,0.179,0.003,0.274,0.167,0.014,0.004,0.028,0.139,0,0,0,0,0,0

【问题讨论】:

  • 你能从文本编辑器显示你的 csv 的前几行吗?我认为您需要在使用 pandas 之前指定分隔符或进行一些预处理 - 也不需要 open() 只需执行 pd.read_csv(args)
  • 是的,我添加了原始文件的前几行以及文件在其临时位置的样子。我不确定该标题是否对于所有上传都保持一致。

标签: django pandas


【解决方案1】:

UploadedFile.read() 以字节为单位返回文件数据,而不是文件路径或类似文件的对象。为了使用 pandas read_csv() 函数,您需要将这些字节转换为流。由于您的文件是 csv,因此最直接的方法是使用 bytes.decode()io.StringIO(),例如:

dataframe = pd.read_csv(io.StringIO(file_obj.read().decode('utf-8')), delimiter=',')

【讨论】:

  • 感谢您的回复!这在没有页眉/页脚时有效。我以更集中的方式再次问了这个问题,以解决存储上传的文件减去页眉/页脚的问题。 stackoverflow.com/questions/59182806/…
猜你喜欢
  • 2017-11-14
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2015-05-14
  • 2013-12-27
  • 2021-01-16
  • 2016-02-22
相关资源
最近更新 更多