【问题标题】:TypeError: 'function' object is not iterableTypeError:“函数”对象不可迭代
【发布时间】:2015-09-29 12:38:59
【问题描述】:

直到最近这段代码才起作用。我添加了一个提示用户输入文件名和扩展名的功能,然后它不起作用,所以我求助于这个版本。现在当我尝试运行它时,我得到了这个:

Traceback (most recent call last):
  File "C:/Code/Samples/Dates/2015-06-07/Large-Scale Data Parsing/Parser/Single_File_Multistep_Counter.py", line 53, in <module>
main()
  File "C:/Code/Samples/Dates/2015-06-07/Large-Scale Data Parsing/Parser/Single_File_Multistep_Counter.py", line 51, in main
writer(final_counts(intermediate_count))
  File "C:/Code/Samples/Dates/2015-06-07/Large-Scale Data Parsing/Parser/Single_File_Multistep_Counter.py", line 31, in final_counts
for file_path in intermediate_file_list:
TypeError: 'function' object is not iterable

我也不完全确定错误是什么意思,经过研究我只能找到 python object not iterable error in functionpython3 TypeError: 'function' object is not iterable 不能解决我的问题。

下面是给我错误的代码:

def final_counts(intermediate_file_list):
    date_list = {}
    for file_path in intermediate_file_list:
        with open(file_path, "r") as f:
            for line in f:
                tockens = line.split(",")
                if tockens[0] in date_list:
                    date_list[tockens[0]] = date_list[tockens[0]] + tockens[1]
                else:
                    date_list[tockens[0]] = tockens[1]
    return date_list

如果需要,我将在稍后的编辑中发布完整的代码。任何解释我需要更改的详细答案都会非常有帮助,我想学习语言以及我做错了什么,所以(希望)以后我不会犯同样的错误。

编辑:这是我的全部代码

import os, glob, csv

location = "C:/Code/Samples/Dates/2015-06-07/Large-Scale Data Parsing/Data Files"
columnname = "smcn"
timecolumn = ""
filetype = ".processed"

def intermediate_count(location, filetype):
    intermediate_file_list = []
    for file_path in list(glob.glob(os.path.join(location, "*" + filetype))):
        date_list = {}
        print file_path
        with open(file_path, 'r') as f:
            for line in f:
                tockens = line.split(",")
                key = tockens[9] + "/" + tockens[15][:-4] #replace col_positon to 9 if necessary
                if key in date_list:
                    date_list[key] = date_list[key] + 1
                else:
                    date_list[key] = 1
        with open(file_path + ".count", "w") as csv:
            for item in date_list:
                csv.write(item + "," + str(date_list[item]) + "\n")
        intermediate_file_list.append(file_path + ".count")
    return intermediate_file_list

def final_counts(intermediate_file_list):
    date_list = {}
    for file_path in intermediate_file_list:
        with open(file_path, "r") as f:
            for line in f:
                tockens = line.split(",")
                if tockens[0] in date_list:
                    date_list[tockens[0]] = date_list[tockens[0]] + tockens[1]
                else:
                    date_list[tockens[0]] = tockens[1]
    return date_list

def writer(date_list):
    directory = location + "/" + "Total"
    if not os.path.exists(directory):
        os.makedirs(directory)
    with open(directory + "/" + "Total.processed", "w") as f: # Lots of commas!
        writer = csv.writer(f, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
        for key, value in date_list.items():
            writer.writerow(str([key]) + str(value))

def main():
    writer(final_counts(intermediate_count))

main()

【问题讨论】:

  • final_counts 被传递一个函数而不是一个可迭代对象。你能显示调用final_counts的代码吗?
  • @TigerhawkT3 我会在一秒钟内发布它。

标签: python python-2.7


【解决方案1】:

在黑暗中拍摄:

intermediate_count 是您创建的帮助函数,它返回一个可迭代对象。

解决方案(如果我的猜测是正确的),你需要调用函数(),否则你正在传递函数对象本身,这就是错误告诉你的内容

writer(final_counts(intermediate_count(location, filetype)))
                                      ^

【讨论】:

  • 宾果游戏!我需要等待几分钟才能接受您的回答,但谢谢!
【解决方案2】:

将您的 main 函数更改为如下所示:

def main():
    writer(final_counts(intermediate_count(location, filetype))

或者,你可以这样写:

def main():
    writer(final_counts(intermediate_count())

然后改变这个:

def intermediate_count(location, filetype):

改为:

def intermediate_count():

【讨论】:

  • 感谢您的回复,但 Cory 的效果很好。当我开始提示用户输入时,我需要将位置和文件类型保留在中间计数函数之外(不断重复输入拒绝,直到输入“好”值)。
猜你喜欢
  • 2018-04-30
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2018-10-10
  • 2021-12-13
  • 2019-02-20
  • 2020-03-27
相关资源
最近更新 更多