【问题标题】:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byteUnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0xff:无效的起始字节
【发布时间】:2016-05-13 02:25:37
【问题描述】:

我正在尝试从链接中删除图片并将其放入图像文件中。请求响应正在返回一个字节流。所以我使用 decode('utf-8') 转换为 unicode 流,但是,我面临以下错误:

打印(info.decode(('utf-8')))

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

    from urllib import request
    img = request.urlopen('http://www.py4inf.com/cover.jpg')
    fhand = open('cover.jpg', 'w')
    size = 0
    while True:
        info = img.read(100000)
        if len(info) < 1 : break
        size = size + len(info)
        print (info.decode(('utf-8')))
        fhand.write(info.decode(('utf-8')))

    print (size,'characters copied.')
    fhand.close()

请让我知道如何继续。谢谢。

【问题讨论】:

  • 流包含一个十六进制值ff的字节,它不是有效的UTF8。所以你得到一个错误。也许是别的什么?
  • 您为什么要尝试将其转换为 Unicode 流?将其保留为字节流。
  • 哦等等,可能是字节序标记...
  • 它是二进制 jpg 图像,而不是字符串。您不应该尝试将其解码为文本。它不喜欢你会得到图像或其他东西的描述。顺便说一句,用二进制打开目标open('cover.jpg', 'wb')
  • 它是一个二进制流,应该不经转换直接写入文件。 decode 用于文本数据,需要从文本的流表示(网页上常见的utf-8)转换为python使用的内部表示。如果你打开目标"wb",你可以直接写入二进制数据而不会出现TypeError。

标签: python utf-8


【解决方案1】:

不要对 JPG 图像使用 Unicode 转换。

Unicode 用于文本。您下载的不是文本,而是其他内容。

试试这个:

from urllib import request
img = request.urlopen('http://www.py4inf.com/cover.jpg')
fhand = open('cover.jpg', 'wb')
size = 0
while True:
    info = img.read(100000)
    if len(info) < 1 : break
    size = size + len(info)
    fhand.write(info)

print (size,'characters copied.')

或者,更简单地说:

from urllib import request
request.urlretrieve('http://www.py4inf.com/cover.jpg', 'cover.jpg')

【讨论】:

    【解决方案2】:

    文件应该以二进制模式打开,然后您可以逐字节复制流。由于shutil 已经有一个方便的辅助工具,你可以

    import shutil
    import os
    from urllib import request
    
    img = request.urlopen('http://www.py4inf.com/cover.jpg')
    with open('cover.jpg', 'wb') as fhand:
        shutil.copyfileobj(img, fhand)
    print(os.stat('cover.jpg').st_size, 'characters copied')
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2017-07-09
      • 1970-01-01
      • 2019-05-07
      • 2018-03-14
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多