为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米琪卡哇伊 2023-10-31 15:01:22
从 csv 导入数据时,我意识到如果第一行不是标题,则会触发此错误list indices must be integers or slices, not strfirst_name,last_name,email,password,roleNoak,Larrett,nlarrett0@ezinearticles.com,8sh15apPjI,StudentDuffie,Milesap,dmilesap1@wikipedia.org,bKNIlIWVfNw,Student仅当第一行是标题时才有效first_name,last_name,email,password,roleNoak,Larrett,nlarrett0@ezinearticles.com,8sh15apPjI,StudentDuffie,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这适用于所有行,除了应始终包含标题的第一行,否则将引发错误。
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

经过几个小时的调试,我找到了这个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/ImportMixin


def 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.py


import_export/formats/base_formats.py/TablibFormat


def 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())


查看完整回答
反对 回复 2023-10-31
  • 1 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信