EgoKilla
EgoKilla

Reputation: 131

Python Find Method in Strings Seems To Be Failing

I have a text file like so: http://pastie.org/10309944

This contains numbers corresponding to lists of EDI segments that could possibly be associated with them. My goal is to write a script that takes in one of these codes (the numbers) as input and outputs the corresponding lists. The lists are surrounded by "-" characters to make the parsing easier.

I wrote the following code: `class SegmentsUsedFinder(object): '''Finds a transaction code and returns the possible segments used. '''

def __init__(self, transaction_code):
    '''Initializes the segment finder.

    Args:
        transaction_code: The transaction code to find possible segments from.
    '''
    self._transaction_code = transaction_code + " -"

def find_segment(self):
    '''Finds the possible segments that correspond to the
       transaction code.
    '''
    fileObject = open("transactioncodes.txt", 'r')
    data = ""
    for line in fileObject:
        line = line.rstrip('\n').rstrip()
        data += line
    fileObject.close()

    position = data.find(self._transaction_code) + len(self._transaction_code) 

    with open("transactioncodes.txt", 'r') as file:
        file.seek(position)
        segments = ""
        char = ""
        while True:
            char = file.read(1)
            if char == "-":
                break
            segments += char 
    return segments

I then create a finder object like so:

finder = SegmentsUsedFinder("270")
print finder.find_segment()

This code actually works but when I adjust the string inside the SegmentsUsedFinder constructor to 271 or 837 it fails for some reason. I think I'm perhaps misusing the find method, but it works for the first instance. I can also get it to work for 271 if I add 2 to position and to work for 837 if I add 4 to position.

Any help would be greatly appreciated, thanks.

Upvotes: 0

Views: 91

Answers (1)

CristiFati
CristiFati

Reputation: 41116

Here's how your find_segment method should look like:

def find_segment(self):
    '''Finds the possible segments that correspond to the
       transaction code.
    '''
    with open("transactioncodes.txt", 'r') as _file:
        for line in _file:
            if line.startswith(self._transaction_code):
                return line[len(self._transaction_code):line.rfind("-")]
    return ""

Of course it can be improved (the file name to be a private member of the class), but this is a prototype that works (assuming that all the lines respect the pattern: ID -LIST-).

Note: I also renamed the variable name to _file because it was shadowing the builtin file type.

Upvotes: 1

Related Questions