使用 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 的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章