Python 将多个字符串转换为ASCII

Python 将多个字符串转换为ASCII,python,Python,这似乎很琐碎,但我似乎无法解决 我有一个包含以下内容的文本文件: B> F 我正在阅读下面的代码,去掉“>”并尝试将字符串转换为相应的ASCII值,减去65,得到一个对应于另一个列表索引的值 def readRoute(): routeFile = open('route.txt', 'r') for line in routeFile.readlines(): route = line.strip('\n' '\r') route = line.

这似乎很琐碎,但我似乎无法解决

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

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]
但是,我在很好地进行转换时遇到了一些问题,因为文本文件目前只包含一行,但理想情况下,我需要它能够支持多行,并为每行运行大量代码

例如,它可以包含:

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,并再次执行上述操作

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

类似的内容如何?它将文件中定义的路由转换为带有
start
end
成员变量的路径对象。作为额外的奖励
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

也许这对你有用。我将fileread转换成了一个生成器,这样你就可以在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

当缩进“#调试”时,您是否询问如何将代码放入
for
循环中缩进的块中您观察到了什么?您可能需要更明确地了解“其他计算”才能得到有用的答案。如果可能,我会尝试将解析与计算分开,以尽可能保持逻辑清晰。@Michael此函数与计算分开,它将解析文件转换并将其返回值传递给其他人函数完成后,才需要读取下一行(如果存在)我为您添加了一个用于调用自定义逻辑的演示函数。我建议您需要更加明确的原因是,我不知道您计划在该逻辑部分中执行什么操作,以及该逻辑是否会影响从文件读取的下一行值。考虑到您希望在执行其他操作之前将值返回给其他函数readlines,生成器是完美的设备。如我的解决方案所示,一次读取一行,在继续文件读取之前,您可以返回两个节点值并根据需要将它们传递给其他函数。此外,您希望在预解析对上运行的任何其他代码都可以轻松插入到“r中的for line”构造中。如何我可以使用yield命令来模拟这个
startNode=ord(route[0])-65
endNode=ord(route[2])-65
,这样我就可以设置变量了。您可以将for-I替换为:“for startNode,endNode in readRoute(filename)”,以便更方便地命名变量。