代码之家  ›  专栏  ›  技术社区  ›  seandavi

在python中将ascii编码转换为int再转换回来(快速)

  •  6
  • seandavi  · 技术社区  · 14 年前

    我有一个文件格式(fastq格式),它将一个整数字符串编码为一个字符串,其中每个整数由一个带偏移量的ascii代码表示。不幸的是,有两种常用编码,一种偏移量为33,另一种偏移量为64。我通常有几个长度为80-150的一亿个字符串要从一个偏移量转换到另一个偏移量。我能想到的最简单的代码就是:

    def phred64ToStdqual(qualin):
        return(''.join([chr(ord(x)-31) for x in qualin]))
    

    ctoi = {}
    itoc = {}
    for i in xrange(127):
        itoc[i]=chr(i)
        ctoi[chr(i)]=i
    
    def phred64ToStdqual2(qualin):
        return(''.join([itoc[ctoi[x]-31] for x in qualin]))
    

    如果我盲目地在赛顿下面跑,我会把它降到不到1秒。

    谢谢,

    肖恩

    1 回复  |  直到 14 年前
        1
  •  4
  •   Mike Axiak    14 年前

    如果你看一下urllib.quote文件,有些东西和你现在做的很相似。它看起来像:

    _map = {}
    def phred64ToStdqual2(qualin):
        if not _map:
            for i in range(31, 127):
                _map[chr(i)] = chr(i - 31)
        return ''.join(map(_map.__getitem__, qualin))
    

    请注意,如果映射的长度不相同(在urllib.quote文件,必须取“%”->“%25”。

    但实际上,由于每个翻译都是相同的长度,python有一个函数可以非常快速地完成: maketrans translate

    import string
    _trans = None
    def phred64ToStdqual4(qualin):
        global _trans
        if not _trans:
            _trans = string.maketrans(''.join(chr(i) for i in range(31, 127)), ''.join(chr(i) for i in range(127 - 31)))
        return qualin.translate(_trans)