Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django导入导出csv头之前的空行在导入时触发异常_Python_Django_Django Import Export - Fatal编程技术网

Python django导入导出csv头之前的空行在导入时触发异常

Python django导入导出csv头之前的空行在导入时触发异常,python,django,django-import-export,Python,Django,Django Import Export,从csv导入数据时,我意识到如果第一行不是标题,就会触发此错误 first_name,last_name,email,password,role Noak,Larrett,nlarrett0@ezinearticles.com,8sh15apPjI,Student Duffie,Milesap,dmilesap1@wikipedia.org,bKNIlIWVfNw,Student ... 列表索引必须是整数或片,而不是str first_name,last_name,email,passw

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

first_name,last_name,email,password,role
Noak,Larrett,nlarrett0@ezinearticles.com,8sh15apPjI,Student
Duffie,Milesap,dmilesap1@wikipedia.org,bKNIlIWVfNw,Student

...
列表索引必须是整数或片,而不是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

...
我尝试在导入之前覆盖
,以删除任何空行

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\u export/admin.py

该类包含一个名为
import\u 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\u format.create\u dataset()
。所以我要做的就是添加一个自定义函数,删除空白行

data = self.remove_blanks(data)
dataset = input_format.create_dataset(data)
导入导出/admin.py/ImportMixin

def remove_blanks(self, data):
    return os.linesep.join([s for s in data.splitlines() if s.strip()])
这样,任何csv文件都不会有任何空行,这将强制第一行作为标题,从而解决问题。我希望这对任何面临同样问题的人都有用

更新:通过覆盖
导入导出/格式/base\u格式.py中的
创建数据集
,也有一种简单的方法可以完成同样的操作

import\u export/formats/base\u 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自动处理这个问题。