text: user136: I'm contributing to a python-based project that uses Biopython to analyze fastq files. It currently uses SeqIO.parse, which populates various structures with all of the fastq information (including converting quality scores). There is apparently a faster (lighter-weight) parser called FastqGeneralIterator that doesn't populate all of these items.
  I'd like to use FastqGeneralIterator, but be able to perform some of the functions SeqIO.parse offers on the fly (not for every sequence). For example, I'd like to convert base quality to PHRED scores for specific sequences, but I don't see that function available.
  Is there an easy way to take a tuple output by FastqGeneralIterator and convert it into a proper Bio.SeqIO SeqRecord? 
  
  user492: I had not come across FastqGeneralIterator before, but I will start using it for some of my work!
  One answer is to replicate the code in the FastqPhredIterator, which does exactly what you are looking to do.  
  However, My personal preference would be to use the biopython infrastructure as much as possible, especially when it comes to the tricky aspects of record parsing.  If the records you want extra info on are uncommon, then using FastqPhredIterator for phred quality extraction might work for you:
  import io
  from Bio.SeqIO.QualityIO import FastqGeneralIterator, FastqPhredIterator
  
  with open("input.fastq", "rU") as handle:
      for title, sequence, quality in FastqGeneralIterator(handle):
          # do something with title, sequence, and quality
          # Set special_case to True when you want more info on the record
          special_case = False
          if special_case:
              record_stream = io.StringIO("\n".join([title, sequence, "+", quality]))
              record = next(FastqPhredIterator(record_stream))
              # do something special with record
  
  What we are doing here is combining the record strings into one and dumping them into a StringIO object, which implements the file handle duck-type. We then hand the in-memory handle to FastqPhredIterator to parse the FASTQ record again. Make sure to set special_case to True only when you want extra info on a record, as the special_case branch makes at least two extra copies of the FASTQ record. 
  
original_text: 136: <p>I'm contributing to a python-based project that uses <code>Biopython</code> to analyze fastq files. It currently uses <code>SeqIO.parse</code>, which populates various structures with all of the fastq information (including converting quality scores). There is apparently a faster (lighter-weight) parser called <a href="http://biopython.org/DIST/docs/api/Bio.SeqIO.QualityIO-module.html#FastqGeneralIterator" rel="nofollow noreferrer">FastqGeneralIterator</a> that doesn't populate all of these items.</p>
  
  <p>I'd like to use <code>FastqGeneralIterator</code>, but be able to perform some of the functions <code>SeqIO.parse</code> offers on the fly (not for <em>every</em> sequence). For example, I'd like to convert base quality to PHRED scores for specific sequences, but I don't see that function available.</p>
  
  <p>Is there an easy way to take a tuple output by <code>FastqGeneralIterator</code> and convert it into a proper <code>Bio.SeqIO</code> <code>SeqRecord</code>? </p>
   492: <p>I had not come across <code>FastqGeneralIterator</code> before, but I will start using it for some of my work!</p>
  
  <p>One answer is to replicate the code in the <a href="http://biopython.org/DIST/docs/api/Bio.SeqIO.QualityIO-pysrc.html#FastqPhredIterator" rel="nofollow noreferrer"><code>FastqPhredIterator</code></a>, which does exactly what you are looking to do.  </p>
  
  <p>However, My personal preference would be to use the biopython infrastructure as much as possible, especially when it comes to the tricky aspects of record parsing.  If the records you want extra info on are uncommon, then using <code>FastqPhredIterator</code> for phred quality extraction might work for you:</p>
  
  <pre class="lang-python prettyprint-override"><code>import io
  from Bio.SeqIO.QualityIO import FastqGeneralIterator, FastqPhredIterator
  
  with open("input.fastq", "rU") as handle:
      for title, sequence, quality in FastqGeneralIterator(handle):
          # do something with title, sequence, and quality
          # Set special_case to True when you want more info on the record
          special_case = False
          if special_case:
              record_stream = io.StringIO("\n".join([title, sequence, "+", quality]))
              record = next(FastqPhredIterator(record_stream))
              # do something special with record
  </code></pre>
  
  <p>What we are doing here is combining the record strings into one and dumping them into a <code>StringIO</code> object, which implements the file handle duck-type. We then hand the in-memory handle to <code>FastqPhredIterator</code> to parse the FASTQ record again. Make sure to set <code>special_case</code> to <code>True</code> only when you want extra info on a record, as the <code>special_case</code> branch makes at least two extra copies of the FASTQ record. </p>
  