有许多类似的问题,但没有一个答案解决了我的问题。
我定义了几个解析大型数据集的函数。首先,我调用数据,然后将数据(在.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')
运行脚本时,会提示我输入'Enter Function Name:',如果输入'function_one'并返回,则返回prints'Function Does Not Exist'。我希望看到,如果输入正确,脚本将只执行用户输入的函数。如果用户输入正确,函数应该运行,并且print解析的数据。
我还尝试使用dict来存储函数,但没有成功。
任何帮助都将不胜感激。
如何使用用户输入调用Python中的函数的可能副本?
删除"in EDOCX1"〔0〕。
@Tinysandy如前所述,我没有成功地应用建议副本中提供的字典解决方案。
为什么你要在一个循环中重新定义你的函数?让我们从那个开始……
@zwer我的理解是,为了逐行(15000多行,可变列长度)处理数据集,必须使用for iter来单独分析所有行。如果不是这样的话,我完全愿意接受其他的建议。我对python和整体编码是全新的。
@drauch-这不是关于读取文件,而是关于在每个循环中重新定义函数。在循环外部创建函数,并将循环中的当前项传递给它们(例如,定义一个类似于def function_one(param): ...的函数,然后在需要时在循环中调用它,称为function_one(entries)(或另一个动态分配的名称,但我们将讨论这个…)
好的。我理解你说的大部分。也许我需要更新将项传递到函数的过程。您是否建议我将函数移出for循环,然后将用户输入放在for循环内选择函数?
根据你的评论,我认为你正在努力实现这样的目标:
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_file.txt包含:
tokenized line 1
tokenized line 2
tokenized line 3
文件中定义的file_name ="test_file.txt",函数定义为:
def function_one(data):
print("function_one called: {}".format(data))
def function_two(data):
print("function_two called: {}".format(data))
def function_three(data):
print("function_three called: {}".format(data))
如果执行代码,这是输出/跟踪:
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']
从逻辑上讲,这对我更有意义。我已经根据您的建议更新了我的代码,但是在运行代码时,没有打印任何内容。我的描述可能有误导性,因为它没有指定我希望在每行之后打印数据分析(假设条件满足),尽管这是我在函数中所做的,所以我不确定为什么它不能工作。我觉得我对函数中的参数做了一些不正确的事情。
@drauch-我在上面添加了一些测试代码,演示了它是如何工作的。将它与您的设置进行比较,看看是否缺少某个组件。如果要比较单个值,请记住,str.split()返回字符串列表,因此如果要将它们与整数进行比较,必须首先将它们转换为整数(即if int(data[0]) == 150...)。
我的IDE中显示的错误是"来自外部作用域的阴影名称‘列’"。我认为原始for循环的更改方式改变了数据的存储方式。为了简单起见,我的完整代码将一些entries存储为新列表column。因此,我尝试使用column作为所有函数的参数,但在运行脚本时仍然一无所获。我觉得我的问题比上面的问题大得多。
要使代码正常工作,只需在调用时保持变量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')
我也试过了。在运行脚本时,会反复提示用户'Enter Function Name:',而不是实际运行已输入的函数。
这可能是因为你把它放在了循环中。您将希望在创建函数后而不是在循环中放置我的脚本。
正确,但是如果我把它移出循环,当我输入函数名时不会发生任何事情。
可能先定义循环外部的函数
我使用for循环作为一种方法,一行一行地对每一行进行分析,以便所选函数将分析一行,然后分析下一行,等等…我相信这是迭代每一行的正确方法。如果不正确,请告诉我。我还是一个初学者,所以任何建议都非常感谢。