尝试将某些数据导入模型时出错。我得到的错误是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方法发送';'会产生错误。
答案 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"))