diff --git a/CHANGELOG.md b/CHANGELOG.md
index 66b60e7..17a90c5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.1.70 March 24, 2020
+
+Added `--maxNFraction` arg to `filter-fasta.py`.
+
 ## 3.1.69 March 23, 2020
 
 Added `--md5` arg to `fasta-sequences.py`.
@@ -429,9 +433,9 @@ Removed bone-headed use of full path to `fasta-join.sh` from
 
 ## 3.0.63 Jan 14, 2019
 
-Added `compareAaReads` and `matchToString` to `aa.py`. Wrote tests in 
+Added `compareAaReads` and `matchToString` to `aa.py`. Wrote tests in
 `test_aa.py` for both. Moved `countPrint` to utils, used by `matchToString`
-in `dna.py` and `aa.py`. Added `compare-aa-sequences.py` to the bin. 
+in `dna.py` and `aa.py`. Added `compare-aa-sequences.py` to the bin.
 
 ## 3.0.62 Dec 30, 2018
 
@@ -444,9 +448,9 @@ and the underlying `ReadFilter` class.
 
 ## 3.0.60 Dec 13, 2018
 
-In `reads.py`, changed the `_makeComplementTable` function so that 
+In `reads.py`, changed the `_makeComplementTable` function so that
 uppercase and lowercase bases are correctly reverse complemented into their
-respective uppercase and lowercase complementary letters. Added a test to 
+respective uppercase and lowercase complementary letters. Added a test to
 `test/reads.py` to confirm that `reverseComplement` does this.
 
 ## 3.0.59 Dec 11, 2018
diff --git a/dark/__init__.py b/dark/__init__.py
index 52bc094..01d72bb 100644
--- a/dark/__init__.py
+++ b/dark/__init__.py
@@ -7,4 +7,4 @@ if sys.version_info < (2, 7):
 # will not be found by the version() function in ../setup.py
 #
 # Remember to update ../CHANGELOG.md describing what's new in each version.
-__version__ = '3.1.69'
+__version__ = '3.1.70'
diff --git a/dark/filter.py b/dark/filter.py
index 07e00d7..216db82 100644
--- a/dark/filter.py
+++ b/dark/filter.py
@@ -1,3 +1,5 @@
+from __future__ import division
+
 import re
 from math import ceil
 from collections import OrderedDict
@@ -187,6 +189,10 @@ def addFASTAFilteringCommandLineOptions(parser):
         '--maxLength', type=int, metavar='N',
         help='The maximum sequence length')
 
+    parser.add_argument(
+        '--maxNFraction', type=float, metavar='N',
+        help='The maximum fraction of Ns that can be present in the sequence')
+
     parser.add_argument(
         '--whitelist', action='append', metavar='SEQUENCE-ID',
         help='Sequence titles (ids) that should be whitelisted')
@@ -297,6 +303,7 @@ def parseFASTAFilteringCommandLineOptions(args, reads):
 
     return reads.filter(
         minLength=args.minLength, maxLength=args.maxLength,
+        maxNFraction=args.maxNFraction,
         whitelist=set(args.whitelist) if args.whitelist else None,
         blacklist=set(args.blacklist) if args.blacklist else None,
         whitelistFile=args.whitelistFile, blacklistFile=args.blacklistFile,
diff --git a/dark/reads.py b/dark/reads.py
index 8da2fef..113ffdd 100644
--- a/dark/reads.py
+++ b/dark/reads.py
@@ -817,6 +817,8 @@ class ReadFilter(object):
 
     @param minLength: The minimum acceptable length.
     @param maxLength: The maximum acceptable length.
+    @param maxNFraction: The maximum fraction of Ns that can be present in the
+        sequence.
     @param removeGaps: If C{True} remove all gaps ('-' characters) from the
         read sequences.
     @param whitelist: If not C{None}, a set of exact read ids that are
@@ -935,8 +937,8 @@ class ReadFilter(object):
     # save and restore the state of the RNG and/or to optionally add
     # 'seed=XXX' to the end of the id of the first read, etc.
 
-    def __init__(self, minLength=None, maxLength=None, removeGaps=False,
-                 whitelist=None, blacklist=None,
+    def __init__(self, minLength=None, maxLength=None, maxNFraction=None,
+                 removeGaps=False, whitelist=None, blacklist=None,
                  whitelistFile=None, blacklistFile=None,
                  titleRegex=None, negativeTitleRegex=None,
                  truncateTitlesAfter=None, keepSequences=None,
@@ -960,6 +962,7 @@ class ReadFilter(object):
 
         self.minLength = minLength
         self.maxLength = maxLength
+        self.maxNFraction = maxNFraction
         self.removeGaps = removeGaps
         self.head = head
         self.removeDuplicates = removeDuplicates
@@ -1126,6 +1129,11 @@ class ReadFilter(object):
                 (self.maxLength is not None and readLen > self.maxLength)):
             return False
 
+        if self.maxNFraction is not None:
+            nFraction = read.sequence.count('N') / readLen
+            if self.maxNFraction < nFraction:
+                return False
+
         if self.removeGaps:
             if read.quality is None:
                 read = read.__class__(read.id, read.sequence.replace('-', ''))

diff --git a/test/test_reads.py b/test/test_reads.py
index 273b87d..ea53b3f 100644
--- a/test/test_reads.py
+++ b/test/test_reads.py
@@ -2550,6 +2550,46 @@ class TestReads(TestCase):
         self.assertEqual(sorted([read2, read3]), sorted(reads))
         self.assertEqual(3, reads.unfilteredLength())
 
+    def testMaxNFractionAllPassNoNs(self):
+        """
+        Test filtering by maximum fraction of Ns. If there are no Ns in the
+        sequences, all must pass the filtering.
+        """
+        read1 = Read('id1', 'ATTA')
+        read2 = Read('id2', 'ATTAAC')
+        initialReads = Reads([read1, read2])
+        initialReads.filter(maxNFraction=0.9)
+
+        reads = Reads(initialReads)
+        self.assertEqual([read1, read2], list(reads))
+
+    def testMaxNFractionOnePasses(self):
+        """
+        Test filtering by maximum fraction of Ns. If there are too many Ns in
+        one of the sequences, only one must pass the filtering.
+        """
+        read1 = Read('id1', 'ATTA')
+        read2 = Read('id2', 'ATTNNN')
+        initialReads = Reads([read1, read2])
+        initialReads.filter(maxNFraction=0.4)
+
+        reads = Reads(initialReads)
+        self.assertEqual([read1], list(reads))
+
+    def testMaxNFractionAllPassNs(self):
+        """
+        Test filtering by maximum fraction of Ns. If there are Ns in the
+        sequence, but below the threshold, all sequences must pass the
+        filtering.
+        """
+        read1 = Read('id1', 'ATTA')
+        read2 = Read('id2', 'ATTNNN')
+        initialReads = Reads([read1, read2])
+        initialReads.filter(maxNFraction=0.6)
+
+        reads = Reads(initialReads)
+        self.assertEqual([read1, read2], list(reads))
+
     def testNoVariableSitesConfirm(self):
         """
         If two Reads have no bases that are variable, nothing should be

Add filtering options for maximum number of Ns in a sequence
test/test_reads.py::TestReads::testMaxNFractionAllPassNoNs test/test_reads.py::TestReads::testMaxNFractionAllPassNs test/test_reads.py::TestReads::testMaxNFractionOnePasses
test/test_reads.py::TestRead::testCasePreservation test/test_reads.py::TestRead::testCheckAlphabetAAReadMatchingReturnTrue test/test_reads.py::TestRead::testCheckAlphabetAAReadNotMatchingRaise test/test_reads.py::TestRead::testCheckAlphabetDNAReadMatchingReturnTrue test/test_reads.py::TestRead::testCheckAlphabetDNAReadNotMatchingRaise test/test_reads.py::TestRead::testCheckAlphabetwithReadMustBePermissive test/test_reads.py::TestRead::testEquality test/test_reads.py::TestRead::testEqualityWithDifferingIds test/test_reads.py::TestRead::testEqualityWithDifferingQuality test/test_reads.py::TestRead::testEqualityWithDifferingSequences test/test_reads.py::TestRead::testEqualityWithNoQuality test/test_reads.py::TestRead::testEqualityWithOneOmittedQuality test/test_reads.py::TestRead::testExpectedAttributes test/test_reads.py::TestRead::testFromDict test/test_reads.py::TestRead::testFromDictNoQuality test/test_reads.py::TestRead::testGetitemFullCopy test/test_reads.py::TestRead::testGetitemId test/test_reads.py::TestRead::testGetitemLength test/test_reads.py::TestRead::testGetitemQuality test/test_reads.py::TestRead::testGetitemReturnsNewRead test/test_reads.py::TestRead::testGetitemReversed test/test_reads.py::TestRead::testGetitemSequence test/test_reads.py::TestRead::testGetitemSingleIndex test/test_reads.py::TestRead::testGetitemWithStep test/test_reads.py::TestRead::testHashDiffersIfIdDiffers test/test_reads.py::TestRead::testHashDiffersIfQualityDiffers test/test_reads.py::TestRead::testHashDiffersIfSequenceDiffers test/test_reads.py::TestRead::testHashIdenticalNoQuality test/test_reads.py::TestRead::testHashIdenticalWithQuality test/test_reads.py::TestRead::testHashViaDict test/test_reads.py::TestRead::testHashViaSet test/test_reads.py::TestRead::testKeepSites test/test_reads.py::TestRead::testKeepSitesAllSites test/test_reads.py::TestRead::testKeepSitesNoSites test/test_reads.py::TestRead::testKeepSitesOutOfRange test/test_reads.py::TestRead::testKeepSitesWithQuality test/test_reads.py::TestRead::testLength test/test_reads.py::TestRead::testLowComplexityFraction test/test_reads.py::TestRead::testLowComplexityFractionEmptySequence test/test_reads.py::TestRead::testLowComplexityFractionOne test/test_reads.py::TestRead::testLowComplexityFractionZero test/test_reads.py::TestRead::testNoQuality test/test_reads.py::TestRead::testRemoveSites test/test_reads.py::TestRead::testRemoveSitesAllSites test/test_reads.py::TestRead::testRemoveSitesNoSites test/test_reads.py::TestRead::testRemoveSitesOutOfRange test/test_reads.py::TestRead::testRemoveSitesWithQuality test/test_reads.py::TestRead::testReverseNoQuality test/test_reads.py::TestRead::testReverseWithQuality test/test_reads.py::TestRead::testToDict test/test_reads.py::TestRead::testToDictNoQuality test/test_reads.py::TestRead::testToFASTA test/test_reads.py::TestRead::testToFASTAWithQuality test/test_reads.py::TestRead::testToFASTQ test/test_reads.py::TestRead::testToFASTQWithNoQuality test/test_reads.py::TestRead::testToUnknownFormat test/test_reads.py::TestRead::testUnequalLengths test/test_reads.py::TestRead::testWalkHSPExactMatch test/test_reads.py::TestRead::testWalkHSPExactMatchWithGap test/test_reads.py::TestRead::testWalkHSPLeftAndRightOverhangingMatch test/test_reads.py::TestRead::testWalkHSPLeftAndRightOverhangingMatchNoWhiskers test/test_reads.py::TestRead::testWalkHSPLeftOverhangingMatch test/test_reads.py::TestRead::testWalkHSPLeftOverhangingMatchNoWhiskers test/test_reads.py::TestRead::testWalkHSPRightOverhangingMatch test/test_reads.py::TestRead::testWalkHSPRightOverhangingMatchNoWhiskers test/test_reads.py::TestDNARead::testGetitemReturnsNewDNARead test/test_reads.py::TestDNARead::testReverseComplement test/test_reads.py::TestDNARead::testReverseComplementAmbiguous test/test_reads.py::TestDNARead::testReverseComplementLowercaseLetters test/test_reads.py::TestDNARead::testReverseComplementReversesQuality test/test_reads.py::TestDNARead::testTranslationOfMultipleStopCodons test/test_reads.py::TestDNARead::testTranslationOfStartCodonATG test/test_reads.py::TestDNARead::testTranslationOfStopCodonTAG test/test_reads.py::TestDNARead::testTranslationOfStopCodonTGA test/test_reads.py::TestDNARead::testTranslations test/test_reads.py::TestDNARead::testTranslationsOfEmptySequence test/test_reads.py::TestDNARead::testTranslationsOfOneBaseSequence test/test_reads.py::TestDNARead::testTranslationsOfTwoBaseSequence test/test_reads.py::TestRNARead::testGetitemReturnsNewRNARead test/test_reads.py::TestRNARead::testReverseComplement test/test_reads.py::TestRNARead::testReverseComplementAmbiguous test/test_reads.py::TestRNARead::testTranslationOfStopCodonUAA test/test_reads.py::TestDNAKozakRead::testEqualFunction test/test_reads.py::TestDNAKozakRead::testEqualFunctionDifferentKozakSequence test/test_reads.py::TestDNAKozakRead::testEqualFunctionDifferentOriginalSequence test/test_reads.py::TestDNAKozakRead::testSequence test/test_reads.py::TestDNAKozakRead::testStart test/test_reads.py::TestDNAKozakRead::testStartGreaterThanStop test/test_reads.py::TestDNAKozakRead::testStartNegative test/test_reads.py::TestDNAKozakRead::testStop test/test_reads.py::TestDNAKozakRead::testStopGreaterThanOriginalSequenceLength test/test_reads.py::TestAARead::testCloseCloseORF test/test_reads.py::TestAARead::testCloseCloseORFWithJunk test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseORF test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenCloseCloseORF test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenCloseCloseORFWithJunk test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenCloseOpenORFWithJunk test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenNothingORF test/test_reads.py::TestAARead::testCloseCloseThenCloseOpenORF test/test_reads.py::TestAARead::testCloseOpenORFWithMultipleStarts test/test_reads.py::TestAARead::testGetitemReturnsNewAARead test/test_reads.py::TestAARead::testNoStartCodon_GithubIssue239 test/test_reads.py::TestAARead::testORFsEmptySequence test/test_reads.py::TestAARead::testORFsEmptySequenceWithStart test/test_reads.py::TestAARead::testORFsEmptySequenceWithStartOpenORFs test/test_reads.py::TestAARead::testORFsEmptySequenceWithStartStop test/test_reads.py::TestAARead::testORFsEmptySequenceWithStartStopOpenORFs test/test_reads.py::TestAARead::testORFsEmptySequenceWithStopStartOpenORFs test/test_reads.py::TestAARead::testORFsSequenceWithOneAAOpenORFs test/test_reads.py::TestAARead::testORFsWithJustStartsAndStops test/test_reads.py::TestAARead::testORFsWithOneStopCodon test/test_reads.py::TestAARead::testORFsWithOneStopCodonOpenORFs test/test_reads.py::TestAARead::testORFsWithTwoStopCodons test/test_reads.py::TestAARead::testOpenCloseORF test/test_reads.py::TestAARead::testOpenCloseORFWithMultipleStops test/test_reads.py::TestAARead::testOpenCloseThenCloseCloseThenCloseOpenORF test/test_reads.py::TestAARead::testOpenCloseThenCloseCloseThenCloseOpenORFWithJunk test/test_reads.py::TestAARead::testOpenCloseThenCloseOpenORF test/test_reads.py::TestAARead::testOpenOpenORF test/test_reads.py::TestAARead::testPropertiesCorrectTranslation test/test_reads.py::TestAARead::testPropertyDetailsCorrectTranslation test/test_reads.py::TestAAReadWithX::testAlphabet test/test_reads.py::TestAAReadWithX::testAlphabetChecking test/test_reads.py::TestAAReadWithX::testGetitemReturnsNewAAReadWithX test/test_reads.py::TestAAReadORF::testClosedClosedId test/test_reads.py::TestAAReadORF::testClosedOpenId test/test_reads.py::TestAAReadORF::testFromDict test/test_reads.py::TestAAReadORF::testOpenClosedId test/test_reads.py::TestAAReadORF::testOpenLeft test/test_reads.py::TestAAReadORF::testOpenOpenId test/test_reads.py::TestAAReadORF::testOpenRight test/test_reads.py::TestAAReadORF::testSequence test/test_reads.py::TestAAReadORF::testStart test/test_reads.py::TestAAReadORF::testStartGreaterThanStop test/test_reads.py::TestAAReadORF::testStartNegative test/test_reads.py::TestAAReadORF::testStop test/test_reads.py::TestAAReadORF::testStopGreaterThanOriginalSequenceLength test/test_reads.py::TestAAReadORF::testToDict test/test_reads.py::TestSSAARead::testCorrectAttributes test/test_reads.py::TestSSAARead::testFromDict test/test_reads.py::TestSSAARead::testGetitemFullCopy test/test_reads.py::TestSSAARead::testGetitemId test/test_reads.py::TestSSAARead::testGetitemLength test/test_reads.py::TestSSAARead::testGetitemReturnsNewRead test/test_reads.py::TestSSAARead::testGetitemReversed test/test_reads.py::TestSSAARead::testGetitemSequence test/test_reads.py::TestSSAARead::testGetitemSingleIndex test/test_reads.py::TestSSAARead::testGetitemStructure test/test_reads.py::TestSSAARead::testGetitemWithStep test/test_reads.py::TestSSAARead::testHashDiffersIfIdDiffers test/test_reads.py::TestSSAARead::testHashDiffersIfSequenceDiffers test/test_reads.py::TestSSAARead::testHashDiffersIfStructureDiffers test/test_reads.py::TestSSAARead::testHashViaDict test/test_reads.py::TestSSAARead::testHashViaSet test/test_reads.py::TestSSAARead::testKeepSites test/test_reads.py::TestSSAARead::testKeepSitesAllSites test/test_reads.py::TestSSAARead::testKeepSitesNoSites test/test_reads.py::TestSSAARead::testKeepSitesOutOfRange test/test_reads.py::TestSSAARead::testReads test/test_reads.py::TestSSAARead::testRemoveSites test/test_reads.py::TestSSAARead::testRemoveSitesAllSites test/test_reads.py::TestSSAARead::testRemoveSitesNoSites test/test_reads.py::TestSSAARead::testRemoveSitesOutOfRange test/test_reads.py::TestSSAARead::testSequenceLengthMatchesStructureLength test/test_reads.py::TestSSAARead::testToDict test/test_reads.py::TestSSAARead::testToString test/test_reads.py::TestSSAARead::testToStringWithExplicitFastaFormat test/test_reads.py::TestSSAARead::testToStringWithExplicitFastaSSFormat test/test_reads.py::TestSSAARead::testToStringWithStructureSuffix test/test_reads.py::TestSSAARead::testToStringWithUnknownFormat test/test_reads.py::TestSSAAReadWithX::testCorrectAttributes test/test_reads.py::TestSSAAReadWithX::testFromDict test/test_reads.py::TestSSAAReadWithX::testGetitemFullCopy test/test_reads.py::TestSSAAReadWithX::testGetitemId test/test_reads.py::TestSSAAReadWithX::testGetitemLength test/test_reads.py::TestSSAAReadWithX::testGetitemReturnsNewRead test/test_reads.py::TestSSAAReadWithX::testGetitemReversed test/test_reads.py::TestSSAAReadWithX::testGetitemSequence test/test_reads.py::TestSSAAReadWithX::testGetitemSingleIndex test/test_reads.py::TestSSAAReadWithX::testGetitemStructure test/test_reads.py::TestSSAAReadWithX::testGetitemWithStep test/test_reads.py::TestSSAAReadWithX::testHashDiffersIfIdDiffers test/test_reads.py::TestSSAAReadWithX::testHashDiffersIfSequenceDiffers test/test_reads.py::TestSSAAReadWithX::testHashDiffersIfStructureDiffers test/test_reads.py::TestSSAAReadWithX::testHashViaDict test/test_reads.py::TestSSAAReadWithX::testHashViaSet test/test_reads.py::TestSSAAReadWithX::testKeepSites test/test_reads.py::TestSSAAReadWithX::testKeepSitesAllSites test/test_reads.py::TestSSAAReadWithX::testKeepSitesNoSites test/test_reads.py::TestSSAAReadWithX::testKeepSitesOutOfRange test/test_reads.py::TestSSAAReadWithX::testReads test/test_reads.py::TestSSAAReadWithX::testRemoveSites test/test_reads.py::TestSSAAReadWithX::testRemoveSitesAllSites test/test_reads.py::TestSSAAReadWithX::testRemoveSitesNoSites test/test_reads.py::TestSSAAReadWithX::testRemoveSitesOutOfRange test/test_reads.py::TestSSAAReadWithX::testSequenceContainingX test/test_reads.py::TestSSAAReadWithX::testSequenceLengthMatchesStructureLength test/test_reads.py::TestSSAAReadWithX::testToDict test/test_reads.py::TestSSAAReadWithX::testToString test/test_reads.py::TestSSAAReadWithX::testToStringWithExplicitFastaFormat test/test_reads.py::TestSSAAReadWithX::testToStringWithExplicitFastaSSFormat test/test_reads.py::TestSSAAReadWithX::testToStringWithStructureSuffix test/test_reads.py::TestSSAAReadWithX::testToStringWithUnknownFormat test/test_reads.py::TestTranslatedRead::testExpectedAttributes test/test_reads.py::TestTranslatedRead::testExpectedFrame test/test_reads.py::TestTranslatedRead::testFromDict test/test_reads.py::TestTranslatedRead::testId test/test_reads.py::TestTranslatedRead::testIdReverseComplemented test/test_reads.py::TestTranslatedRead::testMaximumORFLength test/test_reads.py::TestTranslatedRead::testMaximumORFLengthNoOpenORF test/test_reads.py::TestTranslatedRead::testMaximumORFLengthNoStops test/test_reads.py::TestTranslatedRead::testOutOfRangeFrame test/test_reads.py::TestTranslatedRead::testReverseComplemented test/test_reads.py::TestTranslatedRead::testSequence test/test_reads.py::TestTranslatedRead::testToDict test/test_reads.py::TestReadClassNameToClass::testNames test/test_reads.py::TestReads::testEmptyInitialReads test/test_reads.py::TestReads::testInitialReads test/test_reads.py::TestReads::testManuallyAddedReads test/test_reads.py::TestReads::testManuallyAddedReadsLength test/test_reads.py::TestReads::testNoReads test/test_reads.py::TestReads::testNoReadsLength test/test_reads.py::TestReads::testNoVariableSitesConfirm test/test_reads.py::TestReads::testNoVariableSitesUnconfirm test/test_reads.py::TestReads::testOneAmbiguousCompatibleVariableSitesConfirm test/test_reads.py::TestReads::testOneAmbiguousCompatibleVariableSitesUnconfirm test/test_reads.py::TestReads::testOneAmbiguousIncompatibleVariableSitesConfirm test/test_reads.py::TestReads::testOneAmbiguousIncompatibleVariableSitesUnconfirm test/test_reads.py::TestReads::testOneVariableSitesConfirm test/test_reads.py::TestReads::testOneVariableSitesUnconfirm test/test_reads.py::TestReads::testRepeatedIter test/test_reads.py::TestReads::testSaveAsFASTA test/test_reads.py::TestReads::testSaveAsFASTQ test/test_reads.py::TestReads::testSaveAsFASTQFailsOnReadWithNoQuality test/test_reads.py::TestReads::testSaveFASTAIsDefault test/test_reads.py::TestReads::testSaveReturnsReadCount test/test_reads.py::TestReads::testSaveToFileDescriptor test/test_reads.py::TestReads::testSaveWithUnknownFormat test/test_reads.py::TestReads::testSaveWithUppercaseFormat test/test_reads.py::TestReads::testSubclass test/test_reads.py::TestReads::testSubclassLength test/test_reads.py::TestReads::testSubclassWithAdditionalReads test/test_reads.py::TestReads::testUnfilteredLengthAdditionalReads test/test_reads.py::TestReads::testUnfilteredLengthAdditionalReadsAfterFiltering test/test_reads.py::TestReads::testUnfilteredLengthBeforeIterating test/test_reads.py::TestReads::testUnfilteredLengthInitialReads test/test_reads.py::TestReads::testUnfilteredLengthInitialReadsAfterFiltering test/test_reads.py::TestReads::testUnfilteredLengthInitialReadsIsReads test/test_reads.py::TestReads::testUnfilteredLengthInitialReadsIsReadsWithAdditional test/test_reads.py::TestReads::testUnfilteredLengthInitialSubclassThenFiltered test/test_reads.py::TestReads::testUnfilteredLengthInitialSubclassWithAdditionalThenFiltered test/test_reads.py::TestReads::testUnfilteredLengthInitialSubclassWithNoLen test/test_reads.py::TestReads::testUnfilteredLengthNoReads test/test_reads.py::TestReads::testVariableSitesHeterogeneous test/test_reads.py::TestReads::testVariableSitesHeterogeneousCounts test/test_reads.py::TestReads::testVariableSitesTooHomogeneous test/test_reads.py::TestReads::testVariableSitesUnequalLengths test/test_reads.py::TestReadsFiltering::testAddFiltersThenClearFilters test/test_reads.py::TestReadsFiltering::testFilterBlacklist test/test_reads.py::TestReadsFiltering::testFilterDoNotRemoveDescriptions test/test_reads.py::TestReadsFiltering::testFilterDuplicates test/test_reads.py::TestReadsFiltering::testFilterDuplicatesById test/test_reads.py::TestReadsFiltering::testFilterDuplicatesByIdMD5 test/test_reads.py::TestReadsFiltering::testFilterDuplicatesUseMD5 test/test_reads.py::TestReadsFiltering::testFilterHead test/test_reads.py::TestReadsFiltering::testFilterHeadZero test/test_reads.py::TestReadsFiltering::testFilterKeepSequences test/test_reads.py::TestReadsFiltering::testFilterKeepSequencesNoSequences test/test_reads.py::TestReadsFiltering::testFilterNegativeRegex test/test_reads.py::TestReadsFiltering::testFilterNoArgs test/test_reads.py::TestReadsFiltering::testFilterOnLengthEverythingMatches test/test_reads.py::TestReadsFiltering::testFilterOnLengthNothingMatches test/test_reads.py::TestReadsFiltering::testFilterOnMaxLength test/test_reads.py::TestReadsFiltering::testFilterOnMinLength test/test_reads.py::TestReadsFiltering::testFilterPositiveRegex test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfFiveFromFiveReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfFiveFromOneRead test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfOneFromOneRead test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfTwoFromFiveReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfZeroReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetSizeZeroNoReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetSizeZeroTwoReads test/test_reads.py::TestReadsFiltering::testFilterRemoveDescriptions test/test_reads.py::TestReadsFiltering::testFilterRemoveGaps test/test_reads.py::TestReadsFiltering::testFilterRemoveGapsWithQuality test/test_reads.py::TestReadsFiltering::testFilterRemoveSequences test/test_reads.py::TestReadsFiltering::testFilterRemoveSequencesNoSequences test/test_reads.py::TestReadsFiltering::testFilterReturnsReadInstance test/test_reads.py::TestReadsFiltering::testFilterTruncateTitles test/test_reads.py::TestReadsFiltering::testFilterWhitelist test/test_reads.py::TestReadsFiltering::testFilterWithMinLengthEqualToMaxLength test/test_reads.py::TestReadsFiltering::testFilterWithModifierThatChangesIds test/test_reads.py::TestReadsFiltering::testFilterWithModifierThatOmits test/test_reads.py::TestReadsFiltering::testFilterWithModifierThatOmitsAndChangesIds test/test_reads.py::TestReadsFiltering::testFilteredReadsInstanceHasExpectedLength test/test_reads.py::TestReadsFiltering::testIdLambda test/test_reads.py::TestReadsFiltering::testIdLambdaReturningNone test/test_reads.py::TestReadsFiltering::testKeepSites test/test_reads.py::TestReadsFiltering::testKeepSitesAllSites test/test_reads.py::TestReadsFiltering::testKeepSitesNoSites test/test_reads.py::TestReadsFiltering::testKeepSitesOutOfRange test/test_reads.py::TestReadsFiltering::testKeepSitesWithQuality test/test_reads.py::TestReadsFiltering::testLineNumberFile test/test_reads.py::TestReadsFiltering::testLineNumberFileEmpty test/test_reads.py::TestReadsFiltering::testLineNumberFileFirstLineTooSmall test/test_reads.py::TestReadsFiltering::testLineNumberFileNonAscending test/test_reads.py::TestReadsFiltering::testLineNumberFileRunOutOfSequences test/test_reads.py::TestReadsFiltering::testReadLambda test/test_reads.py::TestReadsFiltering::testReadLambdaReturningNone test/test_reads.py::TestReadsFiltering::testRemoveAndKeepSites test/test_reads.py::TestReadsFiltering::testRemoveSites test/test_reads.py::TestReadsFiltering::testRemoveSitesAllSites test/test_reads.py::TestReadsFiltering::testRemoveSitesNoSites test/test_reads.py::TestReadsFiltering::testRemoveSitesOutOfRange test/test_reads.py::TestReadsFiltering::testRemoveSitesWithQuality test/test_reads.py::TestReadsFiltering::testReverse test/test_reads.py::TestReadsFiltering::testReverseAndReverseComplement test/test_reads.py::TestReadsFiltering::testReverseComplement test/test_reads.py::TestReadsFiltering::testReverseComplementAARead test/test_reads.py::TestReadsFiltering::testReverseComplementNonDNA test/test_reads.py::TestReadsFiltering::testSampleFractionAndNoTrueLengthRaisesValueError test/test_reads.py::TestReadsFiltering::testSampleFractionAndRandomSubsetRaisesValueError test/test_reads.py::TestReadsFiltering::testSampleFractionOne test/test_reads.py::TestReadsFiltering::testSampleFractionPointOne test/test_reads.py::TestReadsFiltering::testSampleFractionZero test/test_reads.py::TestReadsInRAM::testAdd test/test_reads.py::TestReadsInRAM::testFastaFile test/test_reads.py::TestReadsInRAM::testFromReads test/test_reads.py::TestReadsInRAM::testNoReads test/test_reads.py::TestReadsInRAM::testOneReadIndex test/test_reads.py::TestReadsInRAM::testOneReadLength test/test_reads.py::TestReadsInRAM::testOneReadList test/test_reads.py::TestReadsInRAM::testSetItem test/test_reads.py::TestReadsInRAM::testTwoReadsIndex test/test_reads.py::TestReadsInRAM::testTwoReadsLength test/test_reads.py::TestReadsInRAM::testTwoReadsList test/test_reads.py::TestSummarizePosition::testCorrectFrequencies test/test_reads.py::TestSummarizePosition::testExcludeShortSequences test/test_reads.py::TestSummarizePosition::testFrequenciesNoReads test/test_reads.py::TestSummarizePosition::testIndexLargerThanSequenceLength test/test_reads.py::TestSummarizePosition::testNumberOfExclusionsNoReads test/test_reads.py::TestSitesMatching::testAllMatches test/test_reads.py::TestSitesMatching::testIgnoreCase test/test_reads.py::TestSitesMatching::testMatchCase test/test_reads.py::TestSitesMatching::testMultipleReadsAll test/test_reads.py::TestSitesMatching::testMultipleReadsAllWithDifferingLengths test/test_reads.py::TestSitesMatching::testMultipleReadsAny test/test_reads.py::TestSitesMatching::testMultipleReadsAnyWithDifferingLengths test/test_reads.py::TestSitesMatching::testNoMatches test/test_reads.py::TestSitesMatching::testPartialMatch