2017-08-13 103 views
1

我有一個CSV文件,我想用Django自定義管理命令中的自定義命令導入數據。我使用Python 2.7和Django 1.10。這是代碼。使用FileType和Django自定義管理命令?

import csv                                
import argparse 

from awards.models import Student, HomeRoom 
from django.core.management.base import BaseCommand, CommandError 

homeroom = 'HR 12C' 

class Command(BaseCommand): 
    help = "Import students by homeroom." 

    def add_arguments(self, parser): 
     parser.add_argument('csvfile', nargs='+', type=argparse.FileType('r')) 

    def handle(self, *args, **options): 
     student_list = [] 
     hr = HomeRoom.objects.get(name=homeroom) 
     with open(options['csvfile']) as csvfile: 
      reader = csv.DictReader(csvfile) 
      for row in reader: 
       student_list.append(Student(name=row["Student Name"], studentidnum=row["School ID"], homeroom=hr)) 

是的,教室是硬編碼的。我寧願從文件名(這是'HR 12C.csv'),但我不知道如何做到這一點的價值。但這不是真正的問題。當我用這個命令運行上面的代碼:蟒蛇manage.py importcsv「兩項大獎/ 12C.csv」我得到以下錯誤:

File "/home/ssidollars/dollars/awards/management/commands/importcsv.py", line 18, in handle 
with open(options['csvfile']) as csvfile: 
TypeError: coercing to Unicode: need string or buffer, list found 

我不知道我做錯了。它似乎認爲我認爲我通過了一個列表,但是...我沒有看到它可能的任何列表。任何想法我做錯了什麼?

回答

1

如果您只傳遞一個參數,請將nargs='+'更改爲nargs='?'以避免處理列表。

然後解析器返回的options['csvfile']對象已經是TextIOWrapper,不需要再打開它。

你可以用這種方式來實現你想要的:

class Command(BaseCommand): 
    help = "Import students by homeroom." 

    def add_arguments(self, parser): 
     parser.add_argument('csvfile', nargs='?', type=argparse.FileType('r')) 

    def handle(self, *args, **options): 
     student_list = [] 
     hr = HomeRoom.objects.get(name=homeroom) 
     with options['csvfile'] as csvfile: 
      reader = csv.DictReader(csvfile) 
      for row in reader: 
       student_list.append(Student(name=row["Student Name"], studentidnum=row["School ID"], homeroom=hr)) 
+1

謝謝,這是我需要什麼。我從來沒有用過argparse,這些例子讓我感到困惑,因此我不確定那裏發生了什麼。代碼執行完美。 – Jonathanb