正确使用split()

时间:2014-05-12 16:27:05

标签: python split

我正在尝试拆分文本行并将密钥信息存储在字典中。

例如,我的行看起来像:

Lasal_00010 H293|H293_08936 42.37   321 164 8   27  344 37  339 7e-74    236
Lasal_00010 SSEG|SSEG_00350 43.53   317 156 9   30  342 42  339 7e-74    240

对于第一行,我的密钥是“Lasal_00010”,我存储的值是“H293”。

我的当前代码适用于这种情况,但是当我遇到像:

这样的行时
Lasal_00030 SSCG|pSCL4|SSCG_06461   27.06   218 83  6   37  230 35  200 5e-11   64.3

我的代码不会存储字符串“SSCG”。

这是我目前的代码:

dataHash = {}
with open(fasta,'r') as f:
    for ln in f:
        query = ln.split('\t')[0]   
        query.strip()   
        tempValue = ln.split('\t')[1]
        value = tempValue.split('|')[0]
        value.strip()
        if not dataHash.has_key(query):
            dataHash[query] = ''
        else:
            dataHash[query] = value
for x in dataHash:
    print x + " " + str(dataHash[x])

我相信我在两个垂直条的情况下错误地分割了这条线。但我对我的问题在哪里感到困惑。 “SSCG”不应该是我写value = tempValue.split('|')[0]时得到的价值吗?有人可以向我解释分裂是如何运作的还是我错过了什么?

1 个答案:

答案 0 :(得分:4)

在第一个管道上拆分,然后在空间上拆分:

with open(fasta,'r') as f:
    for ln in f:
        query, value = ln.partition('|')[0].split()

我在这里使用了str.partition(),因为你只需要拆分一次。

您的代码会假设标签的使用位置;通过拆分第一个管道第一个,我们可以完全忽略该行的其余部分,从而使第一个管道从第二个列拆分变得更加简单。

演示:

>>> lines = '''\
... Lasal_00010 H293|H293_08936 42.37   321 164 8   27  344 37  339 7e-74    236
... Lasal_00010 SSEG|SSEG_00350 43.53   317 156 9   30  342 42  339 7e-74    240
... Lasal_00030 SSCG|pSCL4|SSCG_06461   27.06   218 83  6   37  230 35  200 5e-11   64.3
... '''
>>> for ln in lines.splitlines(True):
...     query, value = ln.partition('|')[0].split()
...     print query, value
... 
Lasal_00010 H293
Lasal_00010 SSEG
Lasal_00030 SSCG

但是,您的代码也可以工作,尽管效率较低。你真正的问题是:

if not dataHash.has_key(query):
    dataHash[query] = ''
else:
    dataHash[query] = value

这实际上意味着:第一次看到query时,存储一个空字符串,否则存储value。我不知道你为什么这样做;如果没有其他行以Lasal_00030开头,那么你所拥有的只是字典中的空值。如果这不是意图,只需存储值:

dataHash[query] = value

没有if声明。

请注意,dict.has_key()已被弃用;最好使用in来测试密钥:

if query not in dataHash: