text: user2965: I'm trying to download around 2000 proteomes from NCBI, but all I have is the genus and species e.g: lophodermium_seditiosum trichoderma_harzianum
  Does anyone know a good way of doing this in script form?
  My code at the moment is:
  from Bio import Entrez
  from Bio import SeqIO
  import os
  
  file_name = "proteome1.faa"
  net_handle = Entrez.efetch(db="protein", id="trichoderma_harzianum", rettype="gp", retmode="text")
  out_handle = open(file_name, "w")
  out_handle.write(net_handle.read())
  out_handle.close()
  net_handle.close()
  print("Saved")
  
  
  for seq_record in SeqIO.parse("proteome1.faa", "genbank"):
      print(seq_record.id)
      print(repr(seq_record.seq))
      print(len(seq_record))
  
  But I think it wants a number as the id, I don't know if it's possible to convert species name to a numerical ID within the script, or if that's the best way of going about this.
  
  user450: The general procedure is explained here:
  First step is to search the Taxonomy database with the organism name. Accepted common names usually work at all taxonomic levels. Use the scientific name or formal name if no results are obtained with the common name.
  In code:
  from Bio import Entrez
  
  Entrez.email = 'user@example.org' # Put your email here
  
  def get_tax_id(species):
      species = species.replace('_', '+').strip()
      search = Entrez.esearch(term=species, db='taxonomy', retmode='xml')
      record = Entrez.read(search)
      return record['IdList'][0]
  
  if __name__ == '__main__':
      organisms = ['lophodermium_seditiosum', 'trichoderma_harzianum']
      taxids = [get_tax_id(organism) for organism in organisms]
      print(taxids)
  
  This gives us the taxids for our species, respectively 128023 and 5544. Now we can use these to get the proteomes. For Lophodermium seditiosum we find two results, but for Trichoderma harzianum there are 65900 results, so you might want to tweak the query to filter the results. For example, if you only want the sequences appearing in PDB you add AND pdb[filter] so that the query becomes txid5544[Organism:exp] AND pdb[filter].
  def get_proteomes(taxid):
      query = 'txid{}[Organism:exp]'.format(taxid)
      handle = Entrez.esearch(db='protein', term=query)
      result = Entrez.read(handle)
      if int(result['Count']) <= 2000:
          ids = ','.join(result['IdList'])
          proteomes = Entrez.efetch(db='protein', id=ids, rettype='fasta').read()
          return proteomes
      else:
          raise RuntimeError('Too many results!')
  
  if __name__ == '__main__':
      print(get_proteomes('128023'))
  
  Returns:
  >ADI44294.1 actin, partial [Lophodermium seditiosum]
  CKAGFAGDDAPRAVFPSIVGRPRHHGIMIGMGQKDS
  
  >ADI44293.1 actin, partial [Lophodermium seditiosum]
  CKAGFAGDDAPRAVFPSIVGRPRHHGIMIGMGQKDS
  
  
original_text: 2965: <p>I'm trying to download around 2000 proteomes from NCBI, but all I have is the genus and species e.g: <code>lophodermium_seditiosum trichoderma_harzianum</code></p>
  
  <p>Does anyone know a good way of doing this in script form?<br>
  My code at the moment is:</p>
  
  <pre><code>from Bio import Entrez
  from Bio import SeqIO
  import os
  
  file_name = "proteome1.faa"
  net_handle = Entrez.efetch(db="protein", id="trichoderma_harzianum", rettype="gp", retmode="text")
  out_handle = open(file_name, "w")
  out_handle.write(net_handle.read())
  out_handle.close()
  net_handle.close()
  print("Saved")
  
  
  for seq_record in SeqIO.parse("proteome1.faa", "genbank"):
      print(seq_record.id)
      print(repr(seq_record.seq))
      print(len(seq_record))
  </code></pre>
  
  <p>But I think it wants a number as the id, I don't know if it's possible to convert species name to a numerical ID within the script, or if that's the best way of going about this.</p>
   450: <p>The general procedure is explained <a href="https://www.ncbi.nlm.nih.gov/guide/howto/retrieve-seq-org/" rel="nofollow noreferrer">here</a>:</p>
  <p>First step is to search the <a href="https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi" rel="nofollow noreferrer">Taxonomy database</a> with the organism name. Accepted common names usually work at all taxonomic levels. Use the scientific name or formal name if no results are obtained with the common name.</p>
  <p>In code:</p>
  <pre><code>from Bio import Entrez
  
  Entrez.email = 'user@example.org' # Put your email here
  
  def get_tax_id(species):
      species = species.replace('_', '+').strip()
      search = Entrez.esearch(term=species, db='taxonomy', retmode='xml')
      record = Entrez.read(search)
      return record['IdList'][0]
  
  if __name__ == '__main__':
      organisms = ['lophodermium_seditiosum', 'trichoderma_harzianum']
      taxids = [get_tax_id(organism) for organism in organisms]
      print(taxids)
  </code></pre>
  <p>This gives us the <code>taxid</code>s for our species, respectively <code>128023</code> and <code>5544</code>. Now we can use these to get the proteomes. For <em>Lophodermium seditiosum</em> we find two results, but <a href="https://www.ncbi.nlm.nih.gov/protein/?term=txid5544%5BOrganism:exp%5D" rel="nofollow noreferrer">for <em>Trichoderma harzianum</em> there are 65900 results</a>, so you might want to tweak the query to filter the results. For example, if you only want the sequences appearing in PDB you add <code>AND pdb[filter]</code> so that the query becomes <code>txid5544[Organism:exp] AND pdb[filter]</code>.</p>
  <pre><code>def get_proteomes(taxid):
      query = 'txid{}[Organism:exp]'.format(taxid)
      handle = Entrez.esearch(db='protein', term=query)
      result = Entrez.read(handle)
      if int(result['Count']) &lt;= 2000:
          ids = ','.join(result['IdList'])
          proteomes = Entrez.efetch(db='protein', id=ids, rettype='fasta').read()
          return proteomes
      else:
          raise RuntimeError('Too many results!')
  
  if __name__ == '__main__':
      print(get_proteomes('128023'))
  </code></pre>
  <p>Returns:</p>
  <pre><code>&gt;ADI44294.1 actin, partial [Lophodermium seditiosum]
  CKAGFAGDDAPRAVFPSIVGRPRHHGIMIGMGQKDS
  
  &gt;ADI44293.1 actin, partial [Lophodermium seditiosum]
  CKAGFAGDDAPRAVFPSIVGRPRHHGIMIGMGQKDS
  </code></pre>
  