2017-08-13 16 views
1

私は、Djangoカスタム管理コマンドからカスタムコマンドを使用してインポートしたいデータを持つCSVファイルを持っています。私はPython 2.7とDjango 1.10を使用しています。ここにコードがあります。djangoのカスタム管理コマンドでFileTypeを使用していますか?

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')からその値を引き出すだろうが、私はそれを行う方法がわからない。しかし、それは本当の問題ではありません。私は、このコマンドを使用して上記のコードを実行すると:のpython 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

パラメータを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

関連する問題