2013-07-29 70 views
6

我有一個包含許多字段(大約24)的Django模型,顯然我的用戶希望能夠使用電子表格上傳而不是手動輸入所有數據來創建此對象的實例成形式。使用Django和csv.DictReader解析CSV

我發現使用Python中內置的CSV模塊應該使這很簡單,但我很難確定如何使用它。

讓我們先與我有什麼在代碼方面:

def upload_file(request): 

    if request.method == "POST": 
    form = UploadFileForm(request.POST, request.FILES) 
    if form.is_valid(): 
     handle_files(request.FILES['file']) 
     return HttpResponseRedirect('/workflow/') 
    else: 
     print form.errors 
     print request.FILES 
     return HttpResponseRedirect('/workflow/upload') 
    else: 
    form = UploadFileForm() 
    return render(request, 'fileform.html', {'formset': form}) 

這將接受一個CSV文件上傳,並把它關到handle_files應對解析和對象創建。這是我遇到麻煩的方法。

def handle_files(f): 
    reader = csv.DictReader(f, delimiter=' ', quotechar='|') 
    ... #? 

我一直在試圖模仿Python文檔(http://docs.python.org/2/library/csv.html),但DictReader是記錄很差。我是否提供csv.DictReader()適當的參數?如果我有,我如何從reader獲取信息?我將爲用戶提供一個模板,所以我可以假定CSV文件的每一列都有可預測的數據。也就是說,我知道列A將具有對應於字段X的數據,列B對應於Y等。如何解析讀取器中的數據,然後使用該數據創建對象?

我猜它會是這樣的:

for row in reader: 
    X=row[1] 
    Y=row[2] 
    #etc 
    my_object = MyObject(x=X, y=Y) 
    my_object.save() 

就是這個樣子了?我應該使用其他類型的CSV閱讀器嗎?

感謝您的幫助,我知道這個帖子中有很多問題。

回答

2

我剛剛開始使用Django,但我以前使用過python csv庫。當我使用它時,我只需執行以下操作:

import csv 
... 
reader = csv.reader(f) 
for row in reader: 
    #do something with each row 
f.close() 

所以你非常接近。此外,索引編制從0開始,因此如果您需要第一個元素,請使用row[0]

有關於csv庫here的更多信息。如果文件格式不同,您只想使用分隔符和其他參數。

+0

什麼DictReader的那麼點? –

+0

[docs](http://docs.python.org/2/library/csv.html#csv.DictReader)表示它將「創建一個像普通讀者一樣操作的對象,但將讀取的信息映射爲字典其中的鍵由可選的fieldnames參數給出,如果省略了fieldnames參數,則csvfile的第一行中的值將用作字段名稱。這聽起來像你將能夠使用行[「列A」](或根據列名稱不同的鍵) –

3

在創建CSV文件,添加標題:

people.csv

id age height 
1 20 62 
2 22 74 
3 24 68 

def handle_files(f): 
    reader = csv.DictReader(open(f)) 
    for row in reader: 
     id=row['id'] 
     age=row['age'] 
     height=row['height'] 
     my_object = MyObject(id=id, age=age,height=height) 
     my_object.save() 
+0

@DavidCain,@srinu j:這導致「列表索引必須是整數,而不是str」對我來說。在我得到像'id = row [0]''age = [1]'等等的值之前...現在我試圖「智能」地檢測標題,因爲id可能並不總是第一列。我需要在這裏做點別的嗎? – teewuane