Я пишу программу, которая просматривает 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. Может кто-нибудь объяснить, пожалуйста, что происходит?

3
Tom 2 Июл 2010 в 04:42

4 ответа

Лучший ответ

Я думаю, это потому, что вы переопределяете open как список и вызываете его в следующей итерации цикла. Просто дайте списку другое имя.

Обратите внимание, что в строках есть метод split() для случаев, когда вам не нужно регулярное выражение.

10
Bastien Léonard 2 Июл 2010 в 01:47

Тот факт, что open является встроенной функцией, не имеет значения. Это могла быть функция, определенная в том же модуле.

Основная проблема заключается в том, что одно и то же имя использовалось для ссылки на два разных объекта (функцию и список), оба из которых были необходимы снова. Когда первый объект был нужен снова, имя ссылалось на второй объект. Результат: сплат. Золотое правило таково: не используйте имена бездумно.

5
John Machin 2 Июл 2010 в 01:12

Золотое правило таково: никогда не используйте имя встроенной вещи для своих переменных!

Это вопрос алиасинга, просто не вызывайте список open ..

2
Jack 2 Июл 2010 в 00:47

Согласитесь с предыдущими ответами: никогда не вызывайте переменную open или любую другую встроенную,

Вас может заинтересовать модуль csv Python, который будет правильно анализировать файлы CSV, которые { {X0}} не будет.

Также вы можете использовать объект файла в качестве построчного итератора, например:

for line in open('data.csv'):
    do_something(line)
2
tcarobruce 2 Июл 2010 в 01:03