2009-02-25 55 views
2

我有一个非常基本的CSV文件上传模块,可以将我的用户数据批量上传到我的网站。我使用在crontab上运行的python脚本在后端处理CSV文件,然后通过电子邮件向用户发送批量上传的结果。这个过程运行良好,但我的问题是与CSV文件的格式。使用Django/Python将批量.csv数据上传到webapp有什么好方法?

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

另外,如何告诉用户导出为CSV数据?我正在导入地址簿信息,因此这些数据通常来自Outlook,Thunderbird以及其他带有地址簿的软件包。还有其他受欢迎的数据格式,我应该接受吗?

回答

1

我会在脚本上传后处理脚本中的随机列标题映射。很难做出一个能够处理任何用户输入的“全部”。我会根据用户上传的内容慢慢建立一对一关系列表。

或!

检查列标题并确保它的格式正确,并告诉它们如何修复它,如果它不是。

“主要通过电子邮件将”不承认,我们的 架构是“电子邮件”,“地址”,“电话”, 等

你也可以接受XML,这将允许您创建你必须遵守自己的模式。退房this tutorial

4

我会检查出Python的内置csv模块。坦率地说一个.replace()在您的第一行应包括您的同义词的问题,如果你正在使用csv.DictReader你应该能够对付缺少的列很容易:

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

假设你想存储无值缺少字段。

+0

这个答案涵盖了很多重要的概念。只有,csv.DictReader(somecsvfile)可能是csv.DictReader(open(“somecsvfile.csv”,“rb”)) – Pranab 2010-01-14 06:55:58

3

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

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

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

1

看一看这个项目:django-batchimport

这可能是矫枉过正你,但它仍然可以给你提高你自己的代码一些好的想法。

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

1

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

您可以使用textarea的背景作为列数的提示,并将您的标题置于顶部,以表示用户的顺序。

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

然后单击导入按钮,再次验证数据并显示导入结果。 不幸的是,我从来没有听说过有关易用性的反馈。

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

1

请看stdlib中的csv模块。它包含像Excel生成的popualr CSV方言的预设。

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

相关问题