<p>让我们让你的<code>taxids</code>保持原样。在</p>
<pre><code>taxids = [1204725, 2162, 1300163, 420247]
</code></pre>
<p>然后为每个<code>taxid</code>调用<code>get_desired_ranks</code>。在</p>
^{pr2}$
<p>现在为<code>ranks</code>和{<cd7>}中的每个<code>key</code>(rank)调用<code>ncbi.get_taxid_translator</code>输出:</p>
<pre><code>for taxid in taxids:
print(ncbi.get_taxid_translator([taxid]))
ranks = get_desired_ranks(taxid, desired_ranks)
for key, rank in ranks.items():
if rank != '<not present>':
print(ncbi.get_taxid_translator([rank]))
</code></pre>
<p><strong>输出</strong></p>
<pre><code>{1204725: 'Methanobacterium formicicum DSM 3637'}
{183925: 'Methanobacteria'}
{2159: 'Methanobacteriaceae'}
{2160: 'Methanobacterium'}
{28890: 'Euryarchaeota'}
{2162: 'Methanobacterium formicicum'}
{2158: 'Methanobacteriales'}
{2162: 'Methanobacterium formicicum'}
[...]
{420247: 'Methanobrevibacter smithii ATCC 35061'}
{183925: 'Methanobacteria'}
{2159: 'Methanobacteriaceae'}
{2172: 'Methanobrevibacter'}
{28890: 'Euryarchaeota'}
{2173: 'Methanobrevibacter smithii'}
{2158: 'Methanobacteriales'}
</code></pre>
<p><strong>改进输出的完整代码</strong></p>
<pre><code>import csv
from ete3 import NCBITaxa
ncbi = NCBITaxa()
def get_desired_ranks(taxid, desired_ranks):
lineage = ncbi.get_lineage(taxid)
names = ncbi.get_taxid_translator(lineage)
lineage2ranks = ncbi.get_rank(names)
ranks2lineage = dict((rank,taxid) for (taxid, rank) in lineage2ranks.items())
return{'{}_id'.format(rank): ranks2lineage.get(rank, '<not present>') for rank in desired_ranks}
if __name__ == '__main__':
taxids = [1204725, 2162, 1300163, 420247]
desired_ranks = ['kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species']
for taxid in taxids:
print(list(ncbi.get_taxid_translator([taxid]).values())[0])
ranks = get_desired_ranks(taxid, desired_ranks)
for key, rank in ranks.items():
if rank != '<not present>':
print(key + ': ' + list(ncbi.get_taxid_translator([rank]).values())[0])
print('=' * 60)
</code></pre>
<hr/>
<p>如果您想要一个用制表符分隔的输出,可以用<code>\t</code>连接字符串,或者只将所有结果添加到<code>list</code>和{<cd10>}中,并使用<code>\t</code>。在</p>
<p>在下面的代码片段中,结果存储在一个名为<code>list</code>的<code>results</code>中,其中包含另一个存储字段(原始ID、kingdom等)的列表。在每个循环中,结果被添加到最后一个条目(<code>results[-1]</code>)。在</p>
<pre><code>if __name__ == '__main__':
taxids = [1204725, 2162, 1300163, 420247]
desired_ranks = ['kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species']
results = list()
for taxid in taxids:
results.append(list())
results[-1].append(str(taxid))
ranks = get_desired_ranks(taxid, desired_ranks)
for key, rank in ranks.items():
if rank != '<not present>':
results[-1].append(list(ncbi.get_taxid_translator([rank]).values())[0])
else:
results[-1].append(rank)
#generate the header
header = ['Original_query_taxid']
header.extend(desired_ranks)
print('\t'.join(header))
#print the results
for result in results:
print('\t'.join(result))
</code></pre>
<p><strong>输出</strong></p>
<pre><code>Original_query_taxid kingdom phylum class order family genus species
1204725 Methanobacterium formicicum Methanobacteriaceae Euryarchaeota
Methanobacteria Methanobacteriales Methanobacterium <not present>
2162 Methanobacterium formicicum Methanobacteriaceae Euryarchaeota
Methanobacteria Methanobacteriales Methanobacterium <not present>
1300163 Methanobacterium formicicum Methanobacteriaceae Euryarchaeota
Methanobacteria Methanobacteriales Methanobacterium <not present>
420247 Methanobrevibacter smithii Methanobacteriaceae Euryarchaeota
Methanobacteria Methanobacteriales Methanobrevibacter <not present>
</code></pre>