我正在尝试拆分文本行并将密钥信息存储在字典中。
例如,我的行看起来像:
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]
时得到的价值吗?有人可以向我解释分裂是如何运作的还是我错过了什么?
答案 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: