Azure Blob - 使用 Python 读取

Posted

技术标签:

【中文标题】Azure Blob - 使用 Python 读取【英文标题】:Azure Blob - Read using Python 【发布时间】:2018-07-30 13:51:11 【问题描述】:

谁能告诉我是否可以直接从 Azure blob 存储中读取 csv 文件作为流并使用 Python 处理它?我知道它可以使用 C#.Net(如下所示)来完成,但想知道 Python 中的等效库来做到这一点。

CloudBlobClient client = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("outfiles");
CloudBlob blob = container.GetBlobReference("Test.csv");*

【问题讨论】:

@Jay..你对此有什么意见吗? 【参考方案1】:

是的,当然可以这样做。查看Azure Storage SDK for Python

from azure.storage.blob import BlockBlobService

block_blob_service = BlockBlobService(account_name='myaccount', account_key='mykey')

block_blob_service.get_blob_to_path('mycontainer', 'myblockblob', 'out-sunset.png')

您可以在此处阅读完整的 SDK 文档:http://azure-storage.readthedocs.io。

【讨论】:

感谢 Gaurav。我检查了页面,但看不到与 Python 等效的 GetBlobReference 类。 因此您不会像在 .Net SDK 中那样获得对 BlockBlob 的引用。我已经编辑了我的代码以展示如何将 blob 下载到本地文件系统,并添加了指向 SDK 文档的链接。 HTH。 我知道 Python SDK 存在此功能,但我正在寻找类似于 .Net 的功能 所以如果我理解正确,您希望在 Python 中创建 BlockBlob 的实例(如 CloudBlockBlob)。正确的?你介意解释一下背后的原因吗? 它与我们现有的一些作品保持一致...我需要从 blob 中读取文件作为流,进行一些处理并将其写回 blob。整个 Python 应用程序将作为 webjob 运行。我知道我可以将文件从 blob 下载到 Webjob 控制台 (D:) 但想知道 Python 中是否有类似的 .Net 功能,而无需在驱动器中下载文件。【参考方案2】:

这是使用new version of the SDK (12.0.0) 的一种方法:

from azure.storage.blob import BlobClient

blob = BlobClient(account_url="https://<account_name>.blob.core.windows.net"
                  container_name="<container_name>",
                  blob_name="<blob_name>",
                  credential="<account_key>")

with open("example.csv", "wb") as f:
    data = blob.download_blob()
    data.readinto(f)

详情请见here。

【讨论】:

嗨,这仍然会下载文件。是否可以在不下载文件的情况下获取 blob 的内容? 当您执行data = blob.download_blob() 时,blob 的内容将在data 中,您无需写入文件。 @SebastianDziadzio 有没有办法将这些数据读入 python 数据框?我无法使用 blockblovservice 工作 如果您正在下载 CSV 文件,您应该能够将 data 的内容转换为带有 pd.read_csv(data) 的数据框。【参考方案3】:

在此处提供您的 Azure 订阅 Azure 存储名称和密钥作为帐户密钥

block_blob_service = BlockBlobService(account_name='$$$$$$', account_key='$$$$$$')

这仍然会获取 blob 并在当前位置保存为 'output.jpg'

block_blob_service.get_blob_to_path('you-container_name', 'your-blob', 'output.jpg')

这将从 blob 中获取文本/项目

blob_item= block_blob_service.get_blob_to_bytes('your-container-name','blob-name')

    blob_item.content

【讨论】:

【参考方案4】:

可以像这样使用 python 从 blob 流式传输:

from tempfile import NamedTemporaryFile
from azure.storage.blob.blockblobservice import BlockBlobService

entry_path = conf['entry_path']
container_name = conf['container_name']
blob_service = BlockBlobService(
            account_name=conf['account_name'],
            account_key=conf['account_key'])

def get_file(filename):
    local_file = NamedTemporaryFile()
    blob_service.get_blob_to_stream(container_name, filename, stream=local_file, 
    max_connections=2)

    local_file.seek(0)
    return local_file

【讨论】:

谢谢你,非常有用。 TemporaryFile 之后需要清理吗? 乐于帮助:) 根据文档 (docs.python.org/3/library/tempfile.html) 它将被关闭和销毁,无需担心【参考方案5】:

我推荐使用smart_open。

from smart_open import open

# stream from Azure Blob Storage
with open('azure://my_container/my_file.txt') as fin:
    for line in fin:
        print(line)

# stream content *into* Azure Blob Storage (write mode):
with open('azure://my_container/my_file.txt', 'wb') as fout:
    fout.write(b'hello world')

【讨论】:

【参考方案6】:

我知道这是一篇旧帖子,但如果有人想做同样的事情。 我可以按照以下代码访问

注意:您需要设置 AZURE_STORAGE_CONNECTION_STRING,可以从 Azure 门户获取 -> 转到您的存储 -> 设置 -> 访问密钥,然后您将在那里获得连接字符串。

对于 Windows: setx AZURE_STORAGE_CONNECTION_STRING ""

对于 Linux: 导出 AZURE_STORAGE_CONNECTION_STRING=""

对于 macOS: 导出 AZURE_STORAGE_CONNECTION_STRING=""

import os
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient, __version__

connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
print(connect_str)
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
container_client = blob_service_client.get_container_client("Your Storage Name Here")
try:

    print("\nListing blobs...")

    # List the blobs in the container
    blob_list = container_client.list_blobs()
    for blob in blob_list:
        print("\t" + blob.name)

except Exception as ex:
    print('Exception:')
    print(ex)

【讨论】:

【参考方案7】:

以下是使用 Pandas 从 Blob 读取 CSV 的简单方法:

import os
from azure.storage.blob import BlobServiceClient

service_client = BlobServiceClient.from_connection_string(os.environ['AZURE_STORAGE_CONNECTION_STRING'])
client = service_client.get_container_client("your_container")
bc = client.get_blob_client(blob="your_folder/yourfile.csv")
data = bc.download_blob()
with open("file.csv", "wb") as f:
   data.readinto(f)
df = pd.read_csv("file.csv")

【讨论】:

以上是关于Azure Blob - 使用 Python 读取的主要内容,如果未能解决你的问题,请参考以下文章

将 Python DataFrame 作为 CSV 写入 Azure Blob

如何使用 SAS 读取 Azure databricks 中的 blob

如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel

用于读取 blob 架构的 Azure 函数

使用 /mnt/ 将数据从 Azure Blob 存储读取到 Azure Databricks

Azure:无法从 Azure 函数 HttpTrigger 读取 Blob 文本(400 - 错误请求错误)