Python "List" 对象不可调用

3 投票
4 回答
12928 浏览
提问于 2025-04-16 00:42

我正在写一个程序,这个程序会在一个文件夹里查找CSV文件,并把每个CSV文件的内容添加到一个列表里。下面是出问题的代码片段:

import glob
import re 

c = glob.glob("*.csv")
print c
archive = []

for element in c:
    look = open(element, "r").read()
    open = re.split("\n+", look)

    for n in open:
        n = re.split(",", n)[0]
        archive.append(n)

但是,当我运行这个脚本时,出现了一个错误:TypeError: 'list' object is not callable。有人能帮我解释一下这是怎么回事吗?

4 个回答

2

我同意之前的回答:千万不要把变量命名为 open 或其他任何 内置函数 的名字。

你可能会对 Python 的 csv模块 感兴趣,它可以正确解析那些用 re.split(',', line) 解析不了的 csv 文件。

另外,你可以像这样把文件对象当作逐行迭代器来使用:

for line in open('data.csv'):
    do_something(line)
5

其实,open是一个内置函数这件事并不重要。它本来可以是同一个模块里定义的一个函数。

这里的主要问题是,使用了相同的名字来指代两个不同的东西(一个是函数,一个是列表),而这两个东西在后面都需要用到。当第一次需要用到的那个东西再次被需要时,名字却指向了第二个东西。结果就是出错了。记住一个黄金法则:不要随便重复使用名字。

10

我觉得这是因为你把 open 重新定义成了一个列表,然后在下一个循环中又调用了它。你可以给这个列表起个其他的名字。

另外,字符串有一个 split() 方法,可以在你不需要正则表达式的时候使用。

撰写回答