在Django自定义管理命令中使用FileType?

2024-09-30 03:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CSV文件,其中包含要使用Django自定义管理命令中的自定义命令导入的数据。我使用的是python2.7和django1.10。这是密码。在

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))

是的,家庭空间是硬编码的。我宁愿从文件名(它是'hr12c.csv')中提取这个值,但我不知道该怎么做。但这不是真正的问题。当我用以下命令运行上面的代码时:python管理.pyimportsv“awards/12C.csv”我收到以下错误:

^{pr2}$

我不知道我做错了什么。它似乎认为我会给它一个清单,但是。。。我看不到任何可能的名单。你知道我做错了什么吗?在


Tags: csvcsvfilefromimport命令selfadddef
1条回答
网友
1楼 · 发布于 2024-09-30 03:24:57

如果只传递一个参数,请将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))

相关问题 更多 >

    热门问题