1

尝试将一些数据导入我的模型时出现错误。我得到的错误是 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-adaptor 工具,这个错误来自 CsvImporter 的 import_data() 方法,当我尝试将分隔符直接放入 csv.reader(data, delimiter=';' ) 这工作正常,我能够正确查看文件。但无论我如何尝试输入这个 import_data 方法发送一个';' 会产生错误。

4

1 回答 1

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-adaptors 的代码,您可以使用此基类方法验证您的 django-adaptors 模型定义并进行调试。此调用应打印出您定义为 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"))
于 2013-09-25T15:53:37.293 回答