TypeError:在自定义python函数中找到的预期字节,str

时间:2018-02-13 12:02:20

标签: python function encoding error-handling bioinformatics

我正在使用一个名为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

我不知道为什么会这样,我尝试将文件转换为其他类型的编码,但没有任何效果。错误引用的代码段如下:

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

我在Linux子系统上使用Python 3.6 for Windows 10.

3 个答案:

答案 0 :(得分:4)

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

see I_CALLBACK_USER_PROGRAM

或者

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") 文件格式不正确(我可能在复制时弄乱了格式)

<强>更新 如上所述,在调用它时会出现另一个问题:

  

不支持文件类型'HMEC_hg19_BroadHMM_ALL.bed'

这是由基础库.bed仅接受giggle文件引起的,这可以在.bed.gz中看到:

python-giggle/lib/giggle/src/file_read.c

所以我假设python-giggle网站上的自述文件声称您可以使用if ( (strlen(i->file_name) > 7) && strcmp(".bed.gz", file_name + strlen(i->file_name) - 7) == 0) { i->type = BED; } 文件调用它。

我使用.bed中提供的其中一个文件对其进行了测试,并且运行时没有错误

答案 1 :(得分:3)

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

答案 2 :(得分:1)

method GET,POST,PUT编码字符串将解决您的问题:

utf-8