2

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

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

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

4

6 回答 6

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 值。

于 2009-02-25T15:50:32.697 回答
3

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

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

如果您正在处理地址数据,您应该接受vCard

于 2009-02-25T15:54:06.040 回答
1

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

或者!

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

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

您也可以接受 XML,这将允许您创建他们必须遵守的自己的模式。看看这个教程

于 2009-02-25T15:50:13.740 回答
1

看看这个项目:django-batchimport

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

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

于 2009-02-25T15:59:24.903 回答
1

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

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

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

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

无论如何,在实施批量导入时,我仍然将其视为一种选择。

于 2009-02-25T16:15:08.627 回答
1

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

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

于 2009-02-25T22:29:30.397 回答