我如何使用文本文件中的一行作为python中的函数输入?

时间:2012-12-07 06:28:06

标签: python file-io

我编写了一个函数,允许你通过python shell控制turtle模块,这里是它的一部分:

import turtle
turtle.showturtle()
def turtle_commands():
    instructions = input().split()
    i = instructions[0]
    if len(instructions) == 2:
        if i == 'forward' :
            n = int(instructions[1])
            turtle.forward(n)

例如,当您输入

forward 100

乌龟前进100像素。我用大多数海龟命令做了同样的事情 - 向后,向左,向右,平替,下降,颜色等等。

我的问题是,有没有办法从文本文件加载这些命令?我在想这样的事情

instructions = input().split()
i = instructions[0]
if i == 'load' :
    n = str(instructions[1])
    l = open(n, 'r')
    while True:
        line = l.readline()
        turtle_commands(line) #i don't really know what i did here, but hopefully you get the point
        if not line:
            break

程序必须接受来自文件和shell的命令。 谢谢你的回答。

4 个答案:

答案 0 :(得分:3)

假设所有命令都采用<command> <pixels>格式:

# Create a dictionary of possible commands, with the values being pointers
# to the actual function - so that we can call the commands like so:
# commands[command](argument)
commands = {
    'forward': turtle.forward,
    'backwards': turtle.backward,
    'left': turtle.left,
    'right': turtle.right
    # etc., etc.
}

# Use the `with` statement for some snazzy, automatic
# file setting-up and tearing-down
with open('instructions_file', 'r') as instructions:
    for instruction in instructions:  # for line in intructions_file
        # split the line into command, pixels
        instruction, pixels = instruction.split()

        # If the parsed instruction is in `commands`, then run it.
        if instruction in commands:
            commands[instruction](pixels)
        else:
        # If it's not, then raise an error.
            raise()

答案 1 :(得分:1)

应该非常简单 - 只需更改turtle_commands()函数以从参数而不是input()函数获取其输入,如下所示:

def turtle_commands(command):
    instructions = command.split()
    i = instructions[0]
    if len(instructions) == 2:
        if i == 'forward' :
            n = int(instructions[1])
            turtle.forward(n)

然后,使用您从文件中读取的输入命令调用您的函数,就像您在使用行turtle_commands(line)的建议代码中所做的一样。

答案 2 :(得分:0)

map()下使用itertools就足够了。 l.readlines()将返回文件中的所有行作为列表,map内置函数将遍历列表中的所有元素,并将它们作为参数提供给函数turtle_commands

map(turtle_commands, [ int(_) for _ in l.readlines() ] )

map()将为函数提供参数列表。

map(function, params_list)

>>> map(lambda x: x + 1, [1, 2, 3, 4, 5, 6])
[2, 3, 4, 5, 6, 7]

答案 3 :(得分:0)

有一个非常简单的解决方案 - 使用 geattr 功能。 如果您有一系列空格/行尾命令:

instructions = data.split()
commands = instructions[::2]
params   = instructions[1::2]
for command, param in zip(commands,params):
    try:
        getattr(turtle, command)(int(param))
    except AttributeError:
        print('Bad command name:{}'.format(command))