2009-02-25 29 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方言的預設。

讀者類支持字段映射,如果文件包含列標題,它不依賴列順序。對於更復雜的邏輯,比如查找一個字段的多個替代名稱,您需要編寫自己的實現。

相關問題