2013-09-19 3 views
1

При попытке импортировать некоторые данные в мою модель возникает ошибка. Ошибка, которую я получаю, это TypeError: жалуюсь на разделитель, который я использую.Django-Adapters TypeError: «разделитель» должен быть 1-символьной строкой

Ниже приведена моя модель импорта 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 оболочки:

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

Так что я был fi ddling вокруг с инструментами django-адаптера, и эта ошибка исходит из метода import_data() CsvImporter, когда я пытаюсь помещать разделитель непосредственно в csv.reader (data, delimiter = ';'), это отлично работает и Я могу видеть файл правильно. Но как бы я ни старался и не вводил этот метод import_data, отправляющий в ';' будет генерировать ошибку.

ответ

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-адаптеров, вы можете проверить свое определение модели адаптеров django с помощью этого метода базового класса, а также для отладки. Этот вызов должен распечатать то, что вы определили как Meta.delimiter.

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

Но это довольно нормально опустить определение разделителей и называют «import_from_file» на модели. Убедитесь, что не задан разделитель классов. Если это так, импортер запускает snf CSV для обнаружения разделителя из файла, который вы передали. Если вы предоставите файл, который вы упомянули, снифер обнаружит ';' и устанавливает self.delimiter.

>>> from core.models import SkuCsvModel 
>>> SkuCsvModel.has_class_delimiter() 
None 
>>> my_csv_list = SkuCsvModel.import_from_file(file = open("labconco.csv")) 
Смежные вопросы