【问题标题】:Using FileType with django custom management commands?将 FileType 与 django 自定义管理命令一起使用?
【发布时间】:2018-01-21 11:40:19
【问题描述】:

我有一个 CSV 文件,其中包含要使用 Django 自定义管理命令中的自定义命令导入的数据。我正在使用 Python 2.7 和 Django 1.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))

是的,homeroom 是硬编码的。我宁愿从文件名中提取该值(即“HR 12C.csv”),但我不知道该怎么做。但这不是真正的问题。当我使用以下命令运行上述代码时: python manage.py importcsv 'awards/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

我不知道我做错了什么。它似乎认为我正在传递一个列表,但是......我没有看到任何可能的列表。任何想法我做错了什么?

【问题讨论】:

    标签: python django


    【解决方案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))
    

    【讨论】:

    • 谢谢,这正是我所需要的。我从来没有使用过 argparse,这些例子让我很困惑,所以我不确定那里发生了什么。代码执行完美。
    猜你喜欢
    • 2018-06-19
    • 2016-03-28
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2016-07-09
    • 2014-12-13
    • 2019-09-24
    • 2019-10-16
    相关资源
    最近更新 更多