Django-Adapters TypeError:“delimiter”必须是1个字符的字符串

时间:2013-09-19 04:33:55

标签: django python-2.7 csv-import django-adaptors

尝试将某些数据导入模型时出错。我得到的错误是TypeError:抱怨我正在使用的分隔符。

以下是我导入CSV的模型,我使用的是文档建议的默认分隔符。

class SkuCsvModel(CsvModel):
sku_num = models.CharField()
sku_category = models.ForeignKey(SkuCategory)
short_desc = models.CharField()

class Meta:
    delimiter = ";"
    dbModel = Sku

我正在尝试使用的CSV文件如下:

 1365400;9;3/8 BALL VALVE
 1401901;9;BRASS ELBOW
 1406300;9;HOSE BARB, NPT

我在manage.py shell中测试的代码是:

>>> from core.models import SkuCsvModel
>>> my_csv_list = SkuCsvModel.import_data(data = open("labconco.csv"))

最后我得到的错误是:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "E:\bin\Python27\lib\site-packages\adaptor\model.py", line 197, in import_data
    return importer.import_data(data)
  File "E:\bin\Python27\lib\site-packages\adaptor\model.py", line 466, in import_data
    for line in csv.reader(data, delimiter=self.delimiter):
TypeError: "delimiter" must be an 1-character string

所以我一直在使用django-adapter工具,这个错误来自CsvImporter的import_data()方法,当我尝试将分隔符直接放入csv.reader时(data,delimiter = ';')这个工作正常,我能够正确地看到文件。但无论我如何尝试输入这个import_data方法发送';'会产生错误。

1 个答案:

答案 0 :(得分:1)

查看下面的代码段。如果我提供一个整数作为分隔符,它将失败并出现与示例中相同的异常。如果我提供分号作为csv.reader的分隔符,它可以工作。这基本上就是你已经发现的model.CsvImporter.import_data()所做的。

>>> import csv
>>> import StringIO
>>> io = StringIO.StringIO('name;surname\nsascha;gottfried')
>>> for line in csv.reader(io, delimiter=10):
...     print line
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: "delimiter" must be an 1-character string
>>> for line in csv.reader(io, delimiter=';'):
...     print line
... 
['name', 'surname']
['sascha', 'gottfried']

要调试情境,请将“self.delimiter”的当前值转储到控制台或类似控制台,然后再将它作为分隔符传递给csv.reader()。它必须是与';'不同的值和/或类型。查看django-adapters的代码,您可以使用此基类方法验证您的django-adapters模型定义以及调试。此调用应打印出您定义为Meta.delimiter的内容。

>>> from core.models import SkuCsvModel
>>> SkuCsvModel.has_class_delimiter()

但是省略分隔符定义并在模型上调用'import_from_file'是很好的。确保没有定义类别分隔符。如果是这样,导入器将运行CSV嗅探以从您传递的文件中检测分隔符。如果你提供你提到的文件,嗅探器会检测到';'并设置self.delimiter。

>>> from core.models import SkuCsvModel
>>> SkuCsvModel.has_class_delimiter()
None
>>> my_csv_list = SkuCsvModel.import_from_file(file = open("labconco.csv"))