【问题标题】:Django-Adaptors TypeError: "delimiter" must be an 1-character stringDjango-Adaptors TypeError: "delimiter" must be an 1-character string
【发布时间】:2013-09-24 00:57:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    看看下面的sn-p。如果我提供一个整数作为分隔符,它会失败,并出现与您的示例相同的异常。如果我提供一个分号作为 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"))
    

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2017-08-14
      • 2013-07-25
      • 1970-01-01
      • 2012-06-14
      • 2021-06-25
      相关资源
      最近更新 更多