将多个字符串转换为ASCII

时间:2012-02-14 21:31:24

标签: python

这看起来相当微不足道,但我似乎无法解决这个问题

我有一个包含内容的文本文件:

  

B个˚F

我正在阅读下面的代码,剥离'>'并尝试将字符串转换为相应的ASCII值,减去65,得到一个与另一个列表索引相对应的值

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]

但是我在转换时遇到了一些麻烦,因为文本文件目前只包含一行,但理想情况下我需要它能够支持多行并为每一行运行一定量的代码。 / p>

例如,它可能包含:

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

所以我想用不同的输入

在这个函数外运行相同的代码4次

任何能够帮助我的人

编辑:

我不确定我的问题是否明确,对不起

我需要它解析文本文件(可能包含一行或多行,如上所述。我可以用一行代替

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

但是当我尝试多行时会出错,因为ord()期望输入不同 如果我在route.txt中有(下面)

B>F
A>D

这是它给我的错误:

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

上面的代码应该读取route.txt文件并看到B> F是第一条路线,剥去'>' - 转换B& F到ASCII,所以66&分别为70和65,两者分别给出1& 5(在这个例子中) 1&图5是用于进行计算和其他事情的另一个“数组”(列表列表)的对应索引 一旦其他代码完成,它就可以转到route.txt中的下一行,该行可能是A> D并再次执行上述操作

3 个答案:

答案 0 :(得分:1)

也许这对你有用。我把文件读到了一个生成器,所以你可以随意在for-i循环中解析结果。

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

答案 1 :(得分:0)

如果您无法更改readRoute,请在每次调用之前更改文件的内容。更好的是,让readRoute将文件名作为参数(默认为'route.txt'以保留当前行为),这样你就可以让它处理其他文件了。

答案 2 :(得分:0)

这样的事情怎么样?它采用文件中定义的路径,并将它们转换为具有startend成员变量的路径对象。作为额外的奖励PathManager.readFile()允许您加载多个路径文件而不覆盖现有路径。

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)

输出是:

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