2010-07-02 87 views
2

我正在编写一个程序,该程序在目录中查看CSV并将每个CSV的内容附加到列表中。这里是有问题的代码片段:Python“列表”对象不可调用

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。有人能解释一下发生了什么吗?

回答

9

我认为这是因为你重新定义了open作为列表并在下一次循环迭代中调用它。 只要给列表另一个名字。

请注意,当您不需要正则表达式时,字符串有一个split()方法。

2

黄金法则是:永远不要为变量使用内建事物的名称!

这是走样的问题,只是不叫列表open ..

2

与以前的答案同意:不调用变量open或任何其他builtin

你可能感兴趣int Python csv module,它将正确解析csv文件,re.split(',', line)不会。

此外,您还可以使用文件对象的行由行迭代器,像这样:

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

事实上,open是一个内置的功能是无关紧要的。它可能是一个在同一个模块中定义的函数。

基本的问题是,使用相同的名称来引用两个不同的对象(函数和列表),这两个对象都需要再次。当再次需要第一个对象时,该名称将引用第二个对象。结果:图示。黄金法则是:不要不假思索地重用名字。

相关问题