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 シェルでテストしているコードは次のとおりです。

>>> 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ツールをいじっていました.このエラーは、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']

状況をデバッグするには、csv.reader() に区切り文字として渡される前に、'self.delimiter' の現在の値をコンソールなどにダンプします。「;」とは異なる値および/またはタイプである必要があります。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 に答える