如何解决导入时,csv标头触发异常之前django-import-export空行
从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,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文件将没有任何空行,这将强制第一行成为标题,从而解决了问题。我希望这对面临相同问题的任何人都是有用的。
更新:还有一种简单的方法可以通过覆盖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())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。