繁体   English   中英

从 python 中的 Azure Blob 读取 joblib 文件

[英]Reading joblib file from Azure Blob in python

我正在尝试从 Azure blob 读取joblib文件(请参见下面的代码)。 但是,我收到以下错误:

 with open(filename, 'rb') as f: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9d in position 2: invalid start byte

代码:

from azure.storage.blob import BlobClient
import sklearn.externals
import joblib

blob_client = BlobClient.from_connection_string('connection_string', 'myContainer', 'myBlob.joblib')
downloaded_blob = blob_client.download_blob()
model = joblib.load(downloaded_blob.readall())

pickleloads()可以正常工作。 如何使用 joblib 实现相同的目标?

由于读取包含特殊字符的文件而导致的问题

Python 尝试将字节数组(它假定为 utf-8 编码字符串的字节)转换为 unicode 字符串 (str)。 这个过程当然是按照utf-8规则进行解码。 当它尝试这样做时,它遇到了 utf-8 编码字符串中不允许的字节序列(即位置 0 处的这个 0xff)。

使用此解决方案,它将删除(忽略)字符并返回没有它们的字符串。 仅当您需要剥离它们而不是转换它们时才使用它

with open(path, encoding="utf8", errors='ignore') as value:

使用errors='ignore'你只会丢失一些字符。 但是如果您不关心它们,因为它们似乎是源自连接到我的套接字服务器的客户端的错误格式和编程的额外字符。 那么它是一个简单的直接解决方案。

参考: https : //docs.python.org/3/howto/unicode.html#the-unicode-type

解决问题的另一种方法

改变编码方式。 此外,您可以在此处找到其他编码方法标准编码

我使用 readinto 而不是 readall (获取 stream 并避免编码问题),然后使用临时文件将路径读入

def read_blob_model(azure_storage_connectionstring, container_name, path):
    blob_client = BlobClient.from_connection_string(azure_storage_connectionstring, container_name, path)
    downloaded_blob = blob_client.download_blob()
    temp_file = tempfile.mkstemp()
    with open(temp_file[1], 'wb') as f:
        downloaded_blob.readinto(f)
        return temp_file[1]

temp_file = read_blob_model(azure_storage_connectionstring, container_name, roomtype_model)
model = joblib.load(temp_file)

Joblib 也可以从BytesIO而不是文件中读取:

import BytesIO
import joblib

model_binary = BytesIO()
blob_client.download_blob().readinto(model_binary)
model = joblib.load(model_binary)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM