doccano Excel Import Bug

gg58donl  于 2个月前  发布在  其他
关注(0)|答案(1)|浏览(33)

如何复现行为

  1. 轻松创建一个Seq2seq项目
  2. 选择Excel格式导入

个人分析

目前,无法导入Excel。在检查代码后,我发现这是一个代码错误。
代码错误位置和类:/doccano/backend/data_import/pipeline/parsers.py:ExcelParser
错误原因:Doccano上传的文件会修改文件名,导致丢失Excel后缀。然而,Excel文件的内部解析使用了pyexcel库,该库似乎没有方法来识别具有不一致后缀的文件,导致Excel上传失败。

临时修改计划

class ExcelParser(Parser):
    """ExcelParser is a parser to read a excel file."""

    def __init__(self, **kwargs):
        self._errors = []

    def parse(self, filename: str) -> Iterator[Dict[Any, Any]]:
        fn = filename + ".xlsx"
        try:
            os.rename(filename, fn)
            rows = pyexcel.iget_records(file_name=filename)
            for line_num, row in enumerate(rows, start=1):
                yield {LINE_NUMBER_COLUMN: line_num, **row}
        except pyexcel.exceptions.FileTypeNotSupported as e:
            error = FileParseException(filename, line_num=1, message=str(e))
            self._errors.append(error)
        finally:
            os.rename(fn, filename)

    @property
    def errors(self) -> List[FileParseException]:
        return self._errors

要复现的文件

example.xlsx

你的运行环境

我是基于GitHub readme中关于Docker Compose的介绍开始的。因此,整个启动环境没有做任何更改。

gcxthw6b

gcxthw6b1#

如何重现行为

  1. 轻松创建Seq2seq项目
  2. 选择要导入的 Excel 格式

个人分析

这个时候是没有办法导入Excel的。检查代码后发现是代码bug。 代码错误位置和类别:/doccano/backend/data_import/pipeline/parsers.py:ExcelParser
bug原因:Doccano上传的文件会修改文件名,导致Excel后缀丢失。然而Excel文件的内部解析使用的是pyexcel,该库似乎没有办法识别后缀不一致的文件,导致Excel无法上传。

临时改造方案

class ExcelParser(Parser):
    """ExcelParser is a parser to read a excel file."""

    def __init__(self, **kwargs):
        self._errors = []

    def parse(self, filename: str) -> Iterator[Dict[Any, Any]]:
        fn = filename + ".xlsx"
        try:
            os.rename(filename, fn)
            rows = pyexcel.iget_records(file_name=filename)
            for line_num, row in enumerate(rows, start=1):
                yield {LINE_NUMBER_COLUMN: line_num, **row}
        except pyexcel.exceptions.FileTypeNotSupported as e:
            error = FileParseException(filename, line_num=1, message=str(e))
            self._errors.append(error)
        finally:
            os.rename(fn, filename)

    @property
    def errors(self) -> List[FileParseException]:
        return self._errors

重现文件

示例.xlsx

您的环境

我是根据github的readme上对docker compose的介绍开始的。 因此,整个启动环境没有做任何改变。
我修改了您的代码,再文本分类的时候导入数据一样报错

相关问题