使用 Django/Python 将批量 .csv 数据上传到 webapp 的好方法是啥?

Posted

技术标签:

【中文标题】使用 Django/Python 将批量 .csv 数据上传到 webapp 的好方法是啥?【英文标题】:What are good ways to upload bulk .csv data into a webapp using Django/Python?使用 Django/Python 将批量 .csv 数据上传到 webapp 的好方法是什么? 【发布时间】:2010-10-09 20:20:45 【问题描述】:

我有一个非常基本的 CSV 文件上传模块,可以将我的用户数据批量上传到我的网站。我使用在 crontab 上运行的 python 脚本在后端处理 CSV 文件,然后通过电子邮件向用户发送批量上传的结果。这个过程在操作上可以正常工作,但我的问题是 csv 文件的格式。

关于如何接受不同格式的 csv 文件,是否有好的工具甚至是基本规则?用户可能有不同的数据列顺序,列标题的名称略有不同(我希望电子邮件列标题为“电子邮件”,但它可能会显示“主要电子邮件”、“电子邮件地址”),或者缺少其他数据列。有什么好的 CSV 上传功能示例非常宽松且用户友好?

另外,我如何告诉用户导出为 CSV 数据?我正在导入通讯录信息,所以这些数据通常来自 Outlook、Thunderbird、其他有通讯录的软件包。我应该接受其他流行的数据格式吗?

【问题讨论】:

【参考方案1】:

我会查看 Python 的内置 csv 模块。坦率地说,第一行的 .replace() 应该涵盖同义词问题,如果您使用 csv.DictReader,您应该能够非常轻松地处理缺失的列:

my_dict_reader = csv.DictReader(somecsvfile)
for row in my_dict_reader:
    SomeDBModel.address2=row.get('address2', None)

假设您想为缺失的字段存储 None 值。

【讨论】:

这个答案涵盖了很多重要的概念。只是, csv.DictReader(somecsvfile) 可能是 csv.DictReader(open("somecsvfile.csv","rb"))【参考方案2】:

您应该强制将第一行作为标题,让用户将他们的标题与您在下一页上的字段名称相匹配,并记住该映射以供将来转储。

每当我进行 CSV 导入时,数据确实来自 Excel 电子表格。我已经能够通过使用pyexcelerator 直接导入.xls 来节省时间。我的.csv.xls 代码是一个生成器,可以生成'field_name':'data', ... 可以分配给模型对象的字典。

如果你在做地址数据,你应该接受vCard。

【讨论】:

【参考方案3】:

上传后,我会在您的脚本中处理随机列标题映射。很难制作一个“包罗万象”来处理用户可能输入的任何内容。我希望它随着你的发展而发展,并根据你的用户上传的内容慢慢建立一个一对一关系的列表。

或者!

检查列标题并确保其格式正确,如果不正确,建议他们如何修复它。

“主要电子邮件”无法识别,我们的 架构是“电子邮件”、“地址”、“电话”, 等等

您也可以接受 XML,这将允许您创建他们必须遵守的自己的架构。查看this tutorial。

【讨论】:

【参考方案4】:

看看这个项目:django-batchimport

这对你来说可能有点矫枉过正,但它仍然可以为你提供一些改进自己代码的好主意。

编辑:另外,请忽略它仅使用 xlrd 来导入 Excel。基本概念是相同的,只是您将使用 csv 模块而不是 xlrd。

【讨论】:

【参考方案5】:

如果您将 Excel 表格复制到剪贴板,然后将结果粘贴到记事本中,您会注意到它是制表符分隔的。我曾经使用它通过将编辑器中的数据复制粘贴到 html 页面上的 textarea 来从大多数表格编辑器进行批量导入。

您可以使用 textarea 的背景作为列数的提示,并将您的标题放在顶部,建议用户的顺序。

javascript 将处理粘贴的数据并通过简单的预验证立即将它们显示给用户,从而可以轻松修复错误和重新粘贴。

然后单击导入按钮,再次验证数据并显示导入结果。 不幸的是,我从来没有听到任何关于它是否易于使用的反馈。

无论如何,在实现批量导入时,我仍然认为它是一个选项。

【讨论】:

【参考方案6】:

查看 stdlib 中的 csv 模块。它包含流行 CSV 方言的预设,例如 Excel 生成的方言。

Reader 类支持字段映射,如果文件包含列标题,则它不依赖于列顺序。对于更复杂的逻辑,例如查找字段的多个替代名称,您需要编写自己的实现。

【讨论】:

以上是关于使用 Django/Python 将批量 .csv 数据上传到 webapp 的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用python批量将匹配行附加到csv文件

使用逗号分隔符将单个 CSV 列批量转换为多个

将 csv 文件从云存储批量加载到 bigquery

使用 c# 代码在更短的时间内将批量 CSV 数据插入 SQLite

在 Python 中将 .dbf 批量转换为 .csv

将visual foxpro dbf表批量转换为csv