我的代码:

 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.partialstr.encode作为函数对象传递给map str.encode,并使用encoding参数预先填充所需的编码:

from functools import partial
file.write(' '.join(map(partial(str.encode, encoding='utf-8'), tmp)) + '\n')


但是,由于encodingstr.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/

10-12 18:39