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

标签 python django django-import-export

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

列表索引必须是整数或切片,而不是 str


first_name,last_name,email,password,role
Noak,Larrett,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="91fffdf0e3e3f4e5e5a1d1f4ebf8fff4f0e3e5f8f2fdf4e2bff2fefc" rel="noreferrer noopener nofollow">[email protected]</a>,8sh15apPjI,Student
Duffie,Milesap,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6501080c09001604155425120c0e0c1500010c044b0a1702" rel="noreferrer noopener nofollow">[email protected]</a>,bKNIlIWVfNw,Student

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

first_name,last_name,email,password,role
Noak,Larrett,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1c72707d6e6e7968682c5c79667572797d6e68757f70796f327f7371" rel="noreferrer noopener nofollow">[email protected]</a>,8sh15apPjI,Student
Duffie,Milesap,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="56323b3f3a332537266716213f3d3f2633323f3778392431" rel="noreferrer noopener nofollow">[email protected]</a>,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

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

最佳答案

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

关于python - 导入时,django-import-export csv header 之前的空行触发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64324082/

相关文章:

python - Arduino Yun Python 脚本

python - 如何以 Pythonic 方式检测 CSV 文件中缺失的字段?

python - Django Rest Framework 更新嵌套的 m2m 对象。有谁知道更好的方法?

python - 如何在没有大括号或附加符号的情况下将值插入 tkinter 条目?

django - 如何在 django rest 框架上测试注册

python - 子类化 models.Manager

django - 使用 Django 设置 Yeoman

django - 如何使用 Django-Import-Export 导入数据?

django - 自定义 ModelResource 中的字段以下载数据

python - django-import-export:如何使用没有键但有名称的外键导入数据?