不能隐式地将'bytes'对象转换为str

时间:2014-01-12 14:46:44

标签: python python-3.x

我正在尝试打开一个gif文件,并将其字节正确发送到webbrowser,但它会抛出异常'无法将'字节'对象转换为str隐式'并且坦率地说我感到困惑,因为我已将它转换为字符串

files=open("WebContent/"+fileName,"rb")
#size=os.path.getsize("WebContent/"+fileName)
text=str(files.read())
text=text.encode('UTF-8')
defaultResponseCode="HTTP/1.1 200 OK\r\nContent-Type: image/gif\r\nContent-Transfer-Encoding: binary\r\nContent-Length: 29696\r\n\r\n"+text

提前致谢!

3 个答案:

答案 0 :(得分:1)

在这里,您尝试将字节(使用'rb'模式打开的文件)转换为字符串:

text = str(files.read())

将上述行更改为:

text = files.read().decode(encoding='change_to_source_file_encoding')

然后你可以使用:

将unicode字符串转换为utf-8字节字符串
text = text.encode('UTF-8')

如果源编码是utf-8,您只需将files.read()中的字节字符串传递给结果字符串,而无需无意义的解码/编码步骤(从utf-8字节到字符串再到utf-8字节)。 ..

更新:尝试使用requests

url = 'url'
files = {'file': open("WebContent/"+fileName, 'rb')}
response = requests.post(url, files=files)

更新2:

根据响应标题中的内容类型... Content-Type: image/gif ...,您有 files.read() 之后所需格式的数据。编码/解码<!/强>

答案 1 :(得分:0)

对于那些主要对Popen而不是psql感兴趣的人来说,这是一个基于原始Popen问题的调试工作python3脚本,并包含提供的建议。

#!/usr/bin/env python3

# print a list of postgresql databases via psql
import subprocess

username = "postgres"
dbname = "postgres"

p = subprocess.Popen(
  args = ['psql', '-qAt', '-U', username, '-d', dbname],
# args = ['psql', '-qAt', '-d', dbname], # with adequate user permissions
  stdin = subprocess.PIPE,
  stdout = subprocess.PIPE
)
sql = b"SELECT datname FROM pg_database;"

dbs = p.communicate(b"SELECT datname FROM pg_database;")[0].split(b'\n')

for db in dbs:
  print("%s" % db.decode("utf-8"))

p.wait() 

答案 2 :(得分:0)

在python 3+中我遇到了类似的问题,我删除了text.encode("utf-8")并使用了text.strip()

text = text.strip()