2014-02-18 8 views
0

Я хочу, чтобы сохранить значения от вызова функции в текстовом файле, но я получаю TypeError: ожидается, объект буфера символовзначения Сохранение из вызова функции в цикле

def printme(x): 
    "Function f(x) = x(x+2)" 
    print x*(x+2) 
    return 

myfile = open('xyz.txt', 'w') 
    for w in b: 
     myfile.write('%d' (printme(w))) 

myfile.close() 
+0

Пожалуйста, пост фактического ошибка, с отслеживанием, а не описание этого. – abarnert

+0

Вы можете записывать только строки в файлы. Кроме того, ваша функция 'printme' не возвращает« ничего », поэтому вы пытаетесь записать« ничего »в ваш файл на данный момент. –

+1

. Отступ сломан на первом месте. Используйте myfile.write (« {} ». Format (printme (w))) ' –

ответ

7

Есть по крайней мере, четыре проблемы с вашим кодом, как опубликовано, и ни один из них не продемонстрирует ошибку, которую вы на самом деле видите.


Во-первых, есть IndentationError:

myfile = open('xyz.txt', 'w') 
    for w in b: 
    myfile.write('%d' (printme(w))) 

Вы не можете случайно отступа код, где вы хотите; оператор for следует за оператором присваивания, а вызов myfile.write должен находиться внутри цикла for. Итак:

myfile = open('xyz.txt', 'w') 
for w in b: 
    myfile.write('%d' (printme(w))) 

Если вы исправить это, ваша следующая ошибка будет TypeError, но это будет для 'str' object is not callable, а не что-либо об объекте буфера символов.

В Python все, что угодно foo (bar) - вызов функции - попытка вызвать foo как функцию, в качестве единственного аргумента - bar. Таким образом, это выражение:

'%d' (printme(w)) 

... пытается вызвать строку '%d' как функцию, передавая результат printme(w) в качестве единственного аргумента. Очевидно, что это не сработает, потому что строки не вызываются как функции. Отсюда исключение.


Вы, вероятно, хотели использовать оператор % там, как это:

'%d' % (printme(w)) 

Это близко, но до сих пор не совсем правильно, потому что (printme(w)) не кортеж одного значения. Кортежи создаются запятыми, а не скобками, поэтому кортеж одного значения должен иметь в себе запятую. Итак:.

'%d' % (printme(w),) 

(Вы на самом деле не нужно кортежа здесь, потому что % имеет специальную обработку для отдельных значений Но если вы пытаетесь создать кортеж, вы должны получить это право, не ошибетесь и ваш код, возможно, работать в любом случае ...)


и теперь мы приближаемся, но у нас есть еще одна проблема: printme не возвращает номер, он печатает ряд , а затем вернуться s None. (Это значение по умолчанию, которое вы получаете от любой функции, которая не return что-то другое.) Итак, оператор % даст вам еще один TypeError, на этот раз говоря '%d" format: a number is required, not NoneType.

Чтобы исправить это, вы хотите, чтобы return значения вместо (или в дополнении к) его печати:

def printme(x): 
    "Function f(x) = x(x+2)" 
    return x*(x+2) 

Конечно функция с именем printme, что вместо возвращает значение немного вводит в заблуждении, так что вы может захотеть переименовать его в этот момент ...


Если вы исправите это, тогда все будет работать. Нет TypeError, говоря expected a character buffer object в любом месте.

Скорее всего, в вашем фактического кода, вы пытаетесь write значение, которое вы получили назад от printme, без форматирования в строку первого (с этим % оператором или иным способом). Например, если вы сделаете это:

myfile.write(printme(w)) 

... это либо пытается писать None (если вы не решить последнюю проблему) или некоторое число (если вы сделали), ни один из которых является строка (или другой «объект буфера символов»), следовательно, ошибка.

Чтобы исправить это, просто используйте код, который вы показали нам, а не другой код.


Собираем все вместе, здесь работает код, который делает то, что вы, видимо, пытается сделать:

def printme(x): 
    "Function f(x) = x(x+2)" 
    return x*(x+2) 

myfile = open('xyz.txt', 'w') 
for w in b: 
    myfile.write('%d' % (printme(w),)) 

myfile.close() 
+0

Работы пер. - спасибо. Если я хочу добавить разделительную линию между каждым числом в списке b, я повторяю, если это нужно добавить в цикл for? – Klelund

+0

@ user2128383: Да. Поскольку вы уже используете '%' -formatting, очевидный способ сделать это - добавить его в строку формата: 'myfile.write ('% d \ n'% (printme (w),))'. Если вы предпочитаете вместо этого сделать отдельную запись, вы, конечно, можете это сделать. – abarnert

1

Я думаю, это то, что вы хотите

def printme(x): 
    "Function f(x) = x(x+2)" 
    return x*(x+2) 

b = [1,2,3,4,5] 

myfile = open('xyz.txt', 'w') 

for w in b: 
    myfile.write(str(printme(w))) 
    myfile.write("\n") 

# !!! EDIT !!! 
myfile.close() 
+0

Вы изменили формат вывода из того, что пытался сделать его код (что заставляет вас думать, что он хочет иметь новую строку после цифр, если он не хочет пробелов между ними?), И на самом деле сделал его код хуже, забыв «закрыть» файл, и не объяснил ни одного из нескольких изменений, внесенных вами в его код ... – abarnert

+0

doh!Я пропустил последнюю строчку в копии: извините. о \ n я догадался, что он этого захочет. – hexec

+0

Это должно сделать трюк - thx. Но мой txt-файл не показывает никаких строк! – Klelund

Смежные вопросы