我的代码:
for i in range(data.num_nodes):
if embed[i]:
# print embed[i]
tmp = np.sum(embed[i], axis=0) / len(embed[i])
file.write(' '.join(map(str.encode("utf-8"), tmp)) + '\n')
else:
file.write('\n')
但是,当我运行代码时,我得到:
file.write(' '.join(map(str.encode("utf-8"), tmp)) + '\n')
`TypeError: 'bytes' object is not callable`
当我将代码更改为此:
for i in range(data.num_nodes):
if embed[i]:
# print embed[i]
tmp = np.sum(embed[i], axis=0) / len(embed[i])
file.write(' '.join(map(str, tmp)) + '\n')
else:
file.write('\n')
我收到此错误:
TypeError: a bytes-like object is required, not 'str'
最佳答案
map
期望将函数对象作为其第一个参数,并且实际上使用str.encode("utf-8")
调用str.encode
时将'utf-8'
作为第一个参数,并将字串'utf-8'
实际编码为字节,因此当map
调用函数时在第一个参数中,它将失败,因为它实际上是一个字符串。
您应该使用functools.partial
将str.encode
作为函数对象传递给map
str.encode
,并使用encoding
参数预先填充所需的编码:
from functools import partial
file.write(' '.join(map(partial(str.encode, encoding='utf-8'), tmp)) + '\n')
但是,由于
encoding
的str.encode
参数具有默认值'utf-8'
,因此您可以通过直接将map
传递给str.encode
来使str.encode
使用默认值map
:file.write(' '.join(map(str.encode, tmp)) + '\n')
但是由于您真正想做的是将要传递给整个字符串的字节转换为
file.write
,包括' '
和'\n'
都是字符串而不是字节,因此您应该对整个字符串进行编码子字符串的连接和与'\n'
的连接之后:file.write((' '.join(tmp) + '\n').encode())
而且,由于您的
tmp
不是字符串列表,而是numpy.float32
对象的列表,因此在连接之前,应首先将它们映射到字符串:file.write((' '.join(map(str, tmp)) + '\n').encode())
关于python - python3 TypeError:“字节”对象不可调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52923488/