【问题标题】:TypeError: expected bytes, str found in custom python functionTypeError:预期字节,在自定义 python 函数中找到 str
【发布时间】:2018-02-13 12:02:19
【问题描述】:

我正在使用一个名为 Giggle 的新生物信息学工具,并且我已经在我的系统上安装了 python 包装器。 尽管场景非常具体,但我认为问题非常普遍。 这个函数:

index = Giggle.create("index", "HMEC_hg19_BroadHMM_ALL.bed")

应该基于多个(或在本例中为一个).bed 文件创建索引。 床文件如下所示:

chr1    10000   10600   15_Repetitive/CNV   0   .   10000   10600   245,245,245
chr1    10600   11137   13_Heterochrom/lo   0   .   10600   11137   245,245,245
chr1    11137   11737   8_Insulator 0   .   11137   11737   10,190,254
chr1    11737   11937   11_Weak_Txn 0   .   11737   11937   153,255,102
chr1    11937   12137   7_Weak_Enhancer 0   .   11937   12137   255,252,4
chr1    12137   14537   11_Weak_Txn 0   .   12137   14537   153,255,102
chr1    14537   20337   10_Txn_Elongation   0   .   14537   20337   0,176,80

它基本上是一个大的制表符分隔文件,包含基因组区间及其对应的染色体。运行上述命令时出现以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "giggle/giggle.pyx", line 25, in giggle.giggle.Giggle.create
TypeError: expected bytes, str found

我不知道为什么会发生这种情况,我尝试将文件转换为其他类型的编码,但没有任何效果。错误所指的代码sn-p如下:

def create(self, char *path, char *glob):
    giggle_bulk_insert(to_bytes(glob), to_bytes(path), 1)
    return Giggle(path)

我在 Windows 10 的 Linux 子系统上使用 Python 3.6。

【问题讨论】:

    标签: python function encoding error-handling bioinformatics


    【解决方案1】:

    问题在于,在 python 3 中,字符串表示为 unicode 字符串,而不是像在 python 2 中那样的字节字符串。当您安装 giggle 并使用 python 2 运行代码时,一切正常。但你可以这样做:

    index = Giggle.create("index".encode('utf-8'), "HMEC_hg19_BroadHMM_ALL.bed".encode('utf-8'))
    

    或者

    index = Giggle.create(b"index", b"HMEC_hg19_BroadHMM_ALL.bed")
    

    具有明确的字节字符串。它对我有用,直到咯咯地抱怨.bed 文件的格式不正确(我可能在复制时弄乱了格式)

    更新: 如上所述调用它时还会出现另一个问题:

    不支持文件类型“HMEC_hg19_BroadHMM_ALL.bed”

    这是由于底层lib giggle只接受.bed.gz文件造成的,可见python-giggle/lib/giggle/src/file_read.c

    if ( (strlen(i->file_name) > 7) &&
        strcmp(".bed.gz", file_name + strlen(i->file_name) - 7) == 0) {
        i->type = BED;
    }
    

    所以我假设python-giggle 站点上的自述文件声称您可以使用.bed 文件调用它是不正确的。

    我使用python-giggle\lib\giggle\test\data 中提供的文件之一对其进行了测试,它运行时没有出现错误

    【讨论】:

    • 我既惊讶又惊讶你能如此迅速地工作。当我在 python2.7 环境中执行相同操作时,出现以下错误:File type not supported 'GM12878_hg19_BroadHMM_ALL.bed'. Segmentation fault (core dumped)。当我在 python3.6 中尝试 .encode 方法或 b 方法时,我得到了同样的错误,并且在 jupyter notebook 中运行测试时,我的内核在运行 create index 函数时立即死机。既然你这么快就搞定了,能帮我上路吗?
    • 我得到了同样的错误,但认为这是由于我弄乱了格式(我不知道它应该是什么样子)。但我找到了我认为的解决方案,这很奇怪
    • @MatthijsvanKesteren 我已经尝试根据我的发现进行更新
    • 你的眼睛很敏锐。但是,我仍然无法在没有错误的情况下在测试数据上运行它:In [1]: from giggle import Giggle In [2]: index = Giggle.create(b"new_index", b"1k.sort.bed.gz") python: offset_index_store: Could not truncate.: Invalid argument您到底使用了哪个文件?
    • 您是指您自己的数据还是来自python-giggle\lib\giggle\test\data 的一些数据?你遇到了什么错误?
    【解决方案2】:

    create() 方法需要字节字符串:

    create(self, char *path, char *glob):
    

    Cython 在 Python 3 中只能接受 bytes 对象,在 Python 2 中只能接受 str,以自动转换为 char 数组。

    在调用方法时传入bytes 对象(首先对str 对象进行编码),或者更改该方法签名以接受str unicode 字符串。请参阅 Cython 教程中的 Accepting strings from Python code

    【讨论】:

      【解决方案3】:

      utf-8 中编码您的字符串将解决您的问题:

      yourstr.encode('utf-8')
      

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 1970-01-01
        • 2021-09-07
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多