我有一个非常基本的CSV文件上传模块,可以将用户的数据批量上传到我的网站。我使用在crontab上运行的python脚本处理后端的CSV文件,然后通过电子邮件向用户发送批量上传的结果。这个过程在操作上运行正常,但我的问题是csv文件的格式。
是否有关于如何接受不同格式的csv文件的好工具甚至基本规则?用户可能具有不同的数据列顺序,列标题的名称略有不同(我希望电子邮件列标题为“电子邮件”,但它可能会显示“主电子邮件”,“电子邮件地址”)或缺少其他数据列。任何非常宽松且用户友好的CSV上传功能的好例子?
另外,如何告诉用户导出为CSV数据?我正在导入地址簿信息,因此这些数据通常来自Outlook,Thunderbird和其他具有地址簿的软件包。我还应该接受其他流行的数据格式吗?
答案 0 :(得分:4)
我查看了Python的内置csv模块。坦率地说,你的第一行上的.replace()应该涵盖你的同义词问题,如果你使用csv.DictReader,你应该能够很容易地处理丢失的列:
my_dict_reader = csv.DictReader(somecsvfile)
for row in my_dict_reader:
SomeDBModel.address2=row.get('address2', None)
假设您想为缺少的字段存储None值。
答案 1 :(得分:3)
您应该强制第一行作为标题,让用户将其标题与下一页的字段名称相匹配,并记住该映射以用于将来的转储。
每当我进行CSV导入时,数据都来自Excel电子表格。我可以使用pyexcelerator直接导入.xls
来节省时间。我的.csv
或.xls
代码是一个生成{'field_name':'data', ...}
字典的生成器,可以将其分配给模型对象。
如果您正在处理地址数据,则应接受vCard。
答案 2 :(得分:1)
我会在上传脚本后处理随机列标题映射。很难做出“全部捕获”来处理用户可能输入的内容。我会随着你的进展而逐步建立一个基于用户上传内容的一对一关系列表。
或者!
检查列标题并确保其格式正确,并告知他们如何修复它。
“主要电子邮件”未被识别,我们的 架构是“电子邮件”,“地址”,“电话”, 等
您也可以接受XML,这样您就可以创建自己必须遵守的架构。查看this tutorial。
答案 3 :(得分:1)
看看这个项目:django-batchimport
对你来说这可能有点矫枉过正,但它仍然可以为你提供改善自己代码的好主意。
编辑:同样,忽略它只使用xlrd导入Excel。基本概念是相同的,只是您将使用csv模块而不是xlrd。
答案 4 :(得分:1)
如果你将excel表复制到剪贴板然后将结果粘贴到记事本中,你会发现它的标签是分开的。我曾经用它来从大多数表编辑器批量导入,将编辑器中的数据复制粘贴到html页面上的textarea中。
您可以使用textarea的背景作为列数的提示,并将标题放在顶部,表示用户的订单。
Javascript将处理粘贴的数据,并通过简单的预验证立即显示给用户,以便轻松修复错误和重新设置。
然后单击导入按钮,再次验证数据并显示导入结果。 不幸的是,我从来没有听到任何关于何时易于使用的反馈。
无论如何,我仍然在实施批量导入时将其视为一种选择。
答案 5 :(得分:1)
从stdlib查看csv
模块。它包含popualr CSV方言的预设,例如Excel生成的方言。
Reader类支持字段映射,如果文件包含列标题,则它不依赖于列顺序。对于更复杂的逻辑,比如查找字段的几个替代名称,您需要编写自己的实现。