这看起来相当微不足道,但我似乎无法解决这个问题
我有一个包含内容的文本文件:
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并再次执行上述操作
答案 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)
这样的事情怎么样?它采用文件中定义的路径,并将它们转换为具有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