导入时,django-import-export csv 标头之前的空行触发异常

从 csv 导入数据时,我意识到如果第一行不是标题,则会触发此错误


list indices must be integers or slices, not str



first_name,last_name,email,password,role

Noak,Larrett,nlarrett0@ezinearticles.com,8sh15apPjI,Student

Duffie,Milesap,dmilesap1@wikipedia.org,bKNIlIWVfNw,Student

仅当第一行是标题时才有效


first_name,last_name,email,password,role

Noak,Larrett,nlarrett0@ezinearticles.com,8sh15apPjI,Student

Duffie,Milesap,dmilesap1@wikipedia.org,bKNIlIWVfNw,Student


...

我尝试覆盖before_import以删除任何空白行


def before_import(self, dataset, using_transactions, dry_run, **kwargs):

    indexes = []

    for i in range(0, len(dataset)):

        row = ''.join(dataset[i])

        if row.strip() == '':

            indexes.append(i)

    for index in sorted(indexes, reverse=True):

        del dataset[index]          

    return dataset

这适用于所有行,除了应始终包含标题的第一行,否则将引发错误。


米琪卡哇伊
浏览 67回答 1
1回答

达令说

经过几个小时的调试,我找到了这个ImportMixin类,它位于import_export/admin.py该类包含一个名为的方法import_action,如下所示def import_action(self, request, *args, **kwargs):    ...    import_file = form.cleaned_data['import_file']    ...    data = tmp_storage.read(input_format.get_read_mode())    ...    dataset = input_format.create_dataset(data)    ...如您所见,该函数将上传的文件读取为字符串,然后将其传递给input_format.create_dataset(). 所以我所要做的就是添加一个删除空白行的自定义函数data = self.remove_blanks(data)dataset = input_format.create_dataset(data)import_export/admin.py/ImportMixindef remove_blanks(self, data):    return os.linesep.join([s for s in data.splitlines() if s.strip()])这样,任何 csv 文件都不会有任何空行,这将强制第一行成为标题,从而解决问题。我希望这对面临同样问题的人有用。更新:还有一种简单的方法可以通过覆盖来执行相同的create_dataset操作import_export/formats/base_formats.pyimport_export/formats/base_formats.py/TablibFormatdef create_dataset(self, in_stream, **kwargs):    in_stream = os.linesep.join([s for s in in_stream.splitlines() if s.strip()])    try:        return tablib.import_set(in_stream, format=self.get_title())    except:        return tablib.import_set('', format=self.get_title())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python