Python3.x:调用和执行函数的用户输入

Python3.x:调用和执行函数的用户输入,python,function,parsing,input,data-structures,Python,Function,Parsing,Input,Data Structures,有很多类似的问题,但没有一个答案解决了我的问题 我定义了几个解析大型数据集的函数。首先调用数据,然后将数据(在.txt中表示为行和列)组织到列表中,并为各个数据条目编制索引。之后,我建立了我的功能,这些功能将一次处理一个列表。代码如下所示: f = open(fn) for line in iter(f): entries = [i for i in line.split() if i] def function_one(): if entries[0] ==

有很多类似的问题,但没有一个答案解决了我的问题

我定义了几个解析大型数据集的函数。首先调用数据,然后将数据(在.txt中表示为行和列)组织到列表中,并为各个数据条目编制索引。之后,我建立了我的功能,这些功能将一次处理一个列表。代码如下所示:

f = open(fn)
for line in iter(f):

    entries = [i for i in line.split() if i]

    def function_one():
        if entries[0] == 150:
            # do something
    def function_two():
        if entries[1] == 120:
        # do something else
    def function_three():
        if len(entries) > 10:
        # do something else
等等等等

我试图提示用户,当每个函数返回有关数据集的不同内容时,询问他们希望执行什么函数。我的尝试如下:

    f_call = input('Enter Function Name: ')
    if f_call in locals().keys() and callable(locals()['f_call']):
        locals()['f_call']()
    else:
        print('Function Does Not Exist')
当我运行脚本时,系统会提示我输入函数名:,如果我输入
'Function\u one'
并返回,它将打印
。我希望看到,如果输入正确,脚本将只执行用户输入的函数。如果用户输入正确,则应运行该函数并打印分析后的数据

我还尝试使用
dict
存储函数,但没有成功


任何帮助都将不胜感激。

要使您的代码正常工作,只需在调用变量时将变量
f_call
保留为不带“”

f_call = input('Enter Function Name: ')
if f_call in locals().keys() and callable(locals()[f_call]):
    locals()[f_call]()
else:
    print('Function Does Not Exist')

这可能不是最有效的修复方法,但您可以使用以下方法:

f_call = raw_input('Enter Function Name: ')
if f_call == "function_one":
    function_one()
if f_call == "function_two":
    function_two()
if f_call == "function_three":
    function_three()
else:
    print('Function Does Not Exist')
def function_one(data):
    if data[0] == 150:
        pass  # do something

def function_two(data):
    if data[1] == 120:
        pass  # do something else

def function_three(data):
    if len(data) > 10:
        pass # do something entirely different

根据您的评论,我认为您正在努力实现以下目标:

f_call = raw_input('Enter Function Name: ')
if f_call == "function_one":
    function_one()
if f_call == "function_two":
    function_two()
if f_call == "function_three":
    function_three()
else:
    print('Function Does Not Exist')
def function_one(data):
    if data[0] == 150:
        pass  # do something

def function_two(data):
    if data[1] == 120:
        pass  # do something else

def function_three(data):
    if len(data) > 10:
        pass # do something entirely different
这定义了接受参数的函数,以便以后可以重用它们。然后,您想询问用户在处理数据时使用哪个函数,因此:

while True:  # loop while we don't get a valid input
    user_function = input('Enter a function name to use: ')  # ask the user for input
    if user_function in locals() and callable(locals()[user_function]):  # if it exists...
        user_function = locals()[user_function]  # store a pointer to the function
        break  # break out of the while loop since we have our valid input
    else:
        print('Invalid function name, try again...')
最后,您可以加载文件,逐行读取文件,将其拆分,并按照用户决定的功能进行处理:

with open(file_name, "r") as f:
    for line in f:
        entries = line.split()  # no need to check for empty elements
        user_function(entries)  # call the user selected function and pass `entries` to it
当然,您可以在以后进行进一步处理

更新-鉴于文件
test\u file.txt
包含以下内容,下面是对上述代码的简单测试:

tokenized line 1 tokenized line 2 tokenized line 3 如果执行代码,这是输出/跟踪:

Enter a function name to use: bad_name_on_purpose Invalid function name, try again... Enter a function name to use: function_two function_two called: ['tokenized', 'line', '1'] function_two called: ['tokenized', 'line', '2'] function_two called: ['tokenized', 'line', '3'] 输入要使用的函数名:坏名称 无效的函数名,请重试。。。 输入要使用的函数名:function\u two 调用函数\'u two:['tokenized','line','1'] 调用函数[u 2:['tokenized','line','2']
调用函数[u two:['tokenized'、'line'、'3']如果f_调用locals().keys()和callable(locals()['f_call']),则可能重复删除
中的“”。
@tinySandy如前所述,我在应用建议的副本中提供的字典解决方案时失败。你为什么(重新)在循环中定义你的函数?让我们从那一行开始…@zwer我的理解是,为了逐行(15000多行,可变列长度)处理数据集,必须使用iter的一个for单独分析所有行。如果不是这样,我完全愿意接受其他建议。我对Python和整个代码都是全新的,但仍然导致“函数不存在”,我也试过了。运行脚本时,系统会提示用户反复输入函数名,而不是实际运行已输入的函数。这可能是因为您将其放入了循环中。你会希望在函数创建后将我的脚本放入循环中,而不是循环中。正确,但如果我将其移出循环,当我输入一个函数名时,不会发生任何事情。可能先定义循环外的函数我使用for循环作为逐个处理每一行的方法,以便所选函数分析一行,然后分析下一行,依此类推。。。我相信这是遍历每一行的正确方法。如果这是错误的,请让我知道。我还是一个初学者,所以任何建议都非常感谢。从逻辑上讲,这对我来说更有意义。我已根据您的建议更新了代码,但在运行代码时,不会打印任何内容。我的描述可能有误导性,因为它没有指定我希望在每行之后打印数据解析(假设满足条件),尽管这是我在函数中做的事情,所以我不确定为什么它不起作用。我觉得我对函数中的参数做了一些不正确的事情。@DRauch-我在上面添加了一些测试代码,演示了它是如何工作的。将其与设置进行比较,看看是否缺少某些组件。如果您试图比较单个值,请记住,
str.split()
返回一个字符串列表,因此如果您想将它们与整数进行比较,必须首先将它们转换为整数(即
如果int(数据[0])==150…
),则我的IDE中显示的错误是“来自外部范围的阴影名称“列”。我认为我原来的for循环被改变的方式已经改变了数据的存储方式。为了简单起见,我的完整代码将一些
条目
存储为一个新的列表
。因此,我尝试使用
column
作为所有函数的参数,但在运行脚本时仍然一无所获。我觉得我的问题比上面问题中提出的问题要严重得多。