Getting different results for the same function call with the same arguments

Viewed 29
import csv
import sys

def main():
    # TODO: Check for command-line usage
    database_entry = sys.argv[1]
    # database_entry = 'databases/small.csv'
    dna_entry = sys.argv[2]
    # dna_entry = 'sequences/4.txt'

    # TODO: Read database file into a variable
    with open(database_entry, "r") as database:
        reader = csv.reader(database)
        sequences = next(reader)[1:]
    
    # TODO: Read DNA sequence file into a variable
    dna = open(dna_entry, "r")

    # TODO: Find longest match of each STR in DNA sequence
    # for i in range(len(sequences)):
    #     print(sequences[i] + ": " + str(longest_match(dna.read(), sequences[i])))

    print(longest_match(dna.read(), sequences[2]))
    print(longest_match(dna.read(), sequences[2]))

    # TODO: Check database for matching profiles

    return


def longest_match(sequence, subsequence):
    """Returns length of longest run of subsequence in sequence."""

    # Initialize variables
    longest_run = 0
    subsequence_length = len(subsequence)
    sequence_length = len(sequence)

    # Check each character in sequence for most consecutive runs of subsequence
    for i in range(sequence_length):

        # Initialize count of consecutive runs
        count = 0

        # Check for a subsequence match in a "substring" (a subset of characters) within sequence
        # If a match, move substring to next potential match in sequence
        # Continue moving substring and checking for matches until out of consecutive matches
        while True:

            # Adjust substring start and end
            start = i + count * subsequence_length
            end = start + subsequence_length

            # If there is a match in the substring
            if sequence[start:end] == subsequence:
                count += 1
            
            # If there is no match in the substring
            else:
                break
        
        # Update most consecutive matches found
        longest_run = max(longest_run, count)

    # After checking for runs at each character in seqeuence, return longest run found
    return longest_run
    


main()

RESULT:

$ python dna.py databases/large.csv sequences/6.txt

35

0

When same function is called twice with same arguments, why do I get different results?

1 Answers

dna is stream, or a wrapper of a stream, so when you call dna.read(), you are getting the contents of the stream, but also moving your cursor to the end of the file.

Calling dna.read() again reads from your current cursor location (the end of the file), so returns nothing.

To fix it you could move your cursor back to the beginning of the stream using seek between reads like:

print(longest_match(dna.read(), sequences[2]))
dna.seek(0)
print(longest_match(dna.read(), sequences[2]))

Or store the contents in a variable after reading from the stream once:

dna_data = dna.read()
print(longest_match(dna_data, sequences[2]))
print(longest_match(dna_data, sequences[2]))
Related