类型错误:预期的字节数,在自定义 python 函数中找到 str

Mat*_*ren 4 python error-handling encoding function bioinformatics

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

index = Giggle.create("index", "HMEC_hg19_BroadHMM_ALL.bed")
Run Code Online (Sandbox Code Playgroud)

应该基于多个(或在本例中为一个).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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

def create(self, char *path, char *glob):
    giggle_bulk_insert(to_bytes(glob), to_bytes(path), 1)
    return Giggle(path)
Run Code Online (Sandbox Code Playgroud)

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

Fly*_*ler 5

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

index = Giggle.create("index".encode('utf-8'), "HMEC_hg19_BroadHMM_ALL.bed".encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

或者

index = Giggle.create(b"index", b"HMEC_hg19_BroadHMM_ALL.bed")
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是由底层库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;
}
Run Code Online (Sandbox Code Playgroud)

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

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