Daniel
Daniel

Reputation: 379

Conversion of Multiple Strings To ASCII

This seems fairly trivial but I can't seem to work it out

I have a text file with the contents:

B>F

I am reading this with the code below, stripping the '>' and trying to convert the strings into their corresponding ASCII value, minus 65 to give me a value that will correspond to another list index

def readRoute():
    routeFile = open('route.txt', 'r')
    for line in routeFile.readlines():
        route = line.strip('\n' '\r')
        route = line.split('>')
        #startNode, endNode = route
        startNode = ord(route[0])-65
        endNode = ord(route[1])-65

    # Debug  (this comment was for my use to explain below the print values)
    print 'Route Entered:'
    print line
    print startNode, ',', endNode, '\n'
    return[startNode, endNode]

However I am having slight trouble doing the conversion nicely, because the text file only contains one line at the moment but ideally I need it to be able to support more than one line and run an amount of code for each line.

For example it could contain:

B>F
A>D 
C>F 
E>D

So I would want to run the same code outside this function 4 times with the different inputs

Anyone able to give me a hand

Edit:

Not sure I made my issue that clear, sorry

What I need it do it parse the text file (possibly containing one line or multiple lines like above. I am able to do it for one line with the lines

startNode = ord(route[0])-65
endNode = ord(route[1])-65

But I get errors when trying to do more than one line because the ord() is expecting different inputs If I have (below) in the route.txt

B>F
A>D

This is the error it gives me:

line 43, in readRoute  endNode = ord(route[1])-65
TypeError: ord() expected a character, but string of length 2 found

My code above should read the route.txt file and see that B>F is the first route, strip the '>' - convert the B & F to ASCII, so 66 & 70 respectively then minus 65 from both to give 1 & 5 (in this example) The 1 & 5 are corresponding indexes for another "array" (list of lists) to do computations and other things on Once the other code has completed it can then go to the next line in route.txt which could be A>D and perform the above again

Upvotes: 0

Views: 255

Answers (3)

hexparrot
hexparrot

Reputation: 3417

Perhaps this will work for you. I turned the fileread into a generator so you can do as you please with the parsed results in the for-i loop.

def readRoute(file_name): 
    with open(file_name, 'r') as r:
        for line in r:
            yield (ord(line[0])-65, ord(line[2])-65)

filename = 'route.txt'

for startnode, endnode in readRoute(filename):
    print startnode, endnode

Upvotes: 1

user849425
user849425

Reputation:

What about something like this? It takes the routes defined in your file and turns them into path objects with start and end member variables. As an added bonus PathManager.readFile() allows you to load multiple route files without overwriting the existing paths.

import re

class Path:
  def __init__(self, start, end):
     self.start = ord(start) - 65  # Scale the values as desired
     self.end = ord(end) - 65  # Scale the values as desired

class PathManager:
  def __init__(self):
    self.expr = re.compile("^([A-Za-z])[>]([A-Za-z])$") # looks for string "C>C" 
                                                        # where C is a char
    self.paths = []

  def do_logic_routine(self, start, end):
    # Do custom logic here that will execute before the next line is read
    # Return True for 'continue reading' or False to stop parsing file
    return True

  def readFile(self, path):
    file = open(path,"r")
    for line in file:
      item = self.expr.match(line.strip()) # strip whitespaces before parsing
      if item:
        '''
        item.group(0) is *not* used here; it matches the whole expression
        item.group(1) matches the first parenthesis in the regular expression
        item.group(2) matches the second
        '''
        self.paths.append(Path(item.group(1), item.group(2)))
        if not do_logic_routine(self.paths[-1].start, self.paths[-1].end):
          break

# Running the example
MyManager = PathManager()
MyManager.readFile('route.txt')
for path in MyManager.paths:
  print "Start: %s End: %s" % (path.start, path.end)

Output is:

Start: 1 End: 5
Start: 0 End: 3
Start: 2 End: 5
Start: 4 End: 3

Upvotes: 0

Scott Hunter
Scott Hunter

Reputation: 49803

If you can't change readRoute, change the contents of the file before each call. Better yet, make readRoute take the filename as a parameter (default it to 'route.txt' to preserve the current behavior) so you can have it process other files.

Upvotes: 0

Related Questions