【问题标题】:django-import-export empty rows before csv header trigger exception while importingdjango-import-export 导入时 csv 标头触发异常之前的空行
【发布时间】:2020-10-12 19:17:49
【问题描述】:

从 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

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

【问题讨论】:

  • 我见过这个。为什么不直接在导入(手动)之前删除空行?
  • 因为导入数据的是用户,我只想让 Python 自动处理这个问题。

标签: python django django-import-export


【解决方案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/ImportMixin

def remove_blanks(self, data):
    return os.linesep.join([s for s in data.splitlines() if s.strip()])

这样任何 csv 文件都不会有任何空行,这将强制第一行作为标题并解决问题。我希望这对面临同样问题的人有用。

更新:还有一种简单的方法可以做到这一点,即在import_export/formats/base_formats.py 中覆盖create_dataset

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 2015-12-05
    • 2020-04-22
    • 1970-01-01
    • 2018-06-03
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多