объект не может быть вызван - PullRequest
0 голосов
/ 06 февраля 2012

Я пытаюсь преобразовать программу, которая отлично работала с Python 2.7.2, в Python 3.1.4.

Я получаю

TypeError: Str object not callable for the following code on the line "for line in lines:"

Код:

in_file = "INPUT.txt"
out_file = "OUTPUT.txt"

##The following code removes creates frequencies of words

# create list of lower case words, \s+ --> match any whitespace(s)
d1=defaultdict(int)
f1 = open(in_file,'r')
lines = map(str.strip(' '),map(str.lower,f1.readlines()))
f1.close()        
for line in lines:
    s = re.sub(r'[0-9#$?*><@\(\)&;:,.!-+%=\[\]\-\/\^]', " ", line)
    s = s.replace('\t',' ')
    word_list = re.split('\s+',s)
    unique_word_list = [word for word in word_list]  
    for word in unique_word_list:
        if re.search(r"\b"+word+r"\b",s):
            if len(word)>1:
                d1[word]+=1 

Ответы [ 2 ]

6 голосов
/ 06 февраля 2012

Вы передаете строку в качестве первого аргумента для map, который ожидает вызова в качестве первого аргумента:

lines = map(str.strip(' '),map(str.lower,f1.readlines()))

Я думаю, вы хотите следующее:

lines = map( lambda x: x.strip(' '), map(str.lower, f1.readlines()))

, который вызовет strip для каждой строки в результате другого вызова map.

Кроме того, не используйте str в качестве имени переменной, так как это имя встроенной функции.

6 голосов
/ 06 февраля 2012

Я думаю, что ваша диагностика неверна. Ошибка на самом деле происходит в следующей строке:

lines = map(str.strip(' '),map(str.lower,f1.readlines()))

Я рекомендую изменить код следующим образом:

in_file = "INPUT.txt"
out_file = "OUTPUT.txt"

##The following code removes creates frequencies of words

# create list of lower case words, \s+ --> match any whitespace(s)
d1=defaultdict(int)
with open(in_file,'r') as f1:
    for line in f1:
        line = line.strip().lower()
        ...

Обратите внимание на использование оператора with, итерации по файлу и то, как strip() и lower() перемещены внутри тела цикла.

...