我试图拆分文本行,并将关键信息存储在字典中。
例如,我的行看起来如下:
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]时得到的值吗?有人能向我解释一下斯普利特是怎么工作的还是我错过了什么?
发布于 2014-05-12 16:28:21
在第一根管子上分开,然后在空间上:
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:https://stackoverflow.com/questions/23614205
复制相似问题