ran*_*.me 7 python azure azure-storage-blobs pandas azure-machine-learning-studio
我有一些大的csv(制表符分隔)数据存储为azure blob,我想从这些创建一个pandas数据帧.我可以在本地做到如下:
from azure.storage.blob import BlobService
import pandas as pd
import os.path
STORAGEACCOUNTNAME= 'account_name'
STORAGEACCOUNTKEY= "key"
LOCALFILENAME= 'path/to.csv'
CONTAINERNAME= 'container_name'
BLOBNAME= 'bloby_data/000000_0'
blob_service = BlobService(account_name=STORAGEACCOUNTNAME, account_key=STORAGEACCOUNTKEY)
# Only get a local copy if haven't already got it
if not os.path.isfile(LOCALFILENAME):
blob_service.get_blob_to_path(CONTAINERNAME,BLOBNAME,LOCALFILENAME)
df_customer = pd.read_csv(LOCALFILENAME, sep='\t')
Run Code Online (Sandbox Code Playgroud)
但是,当在azure ML笔记本上运行笔记本时,我无法"保存本地副本"然后从csv读取,所以我想直接进行转换(类似于pd.read_azure_blob(blob_csv)或只是pd .read_csv(blob_csv)将是理想的).
我可以获得所需的最终结果(blob csv数据的pandas数据帧),如果我首先创建一个azure ML工作区,然后将数据集读入其中,最后使用https://github.com/Azure/Azure-MachineLearning -ClientLibrary-Python以数据集的形式访问数据集,但我更喜欢直接从blob存储位置读取数据集.
hui*_*hen 14
接受的答案在最新的 Azure 存储 SDK 中不起作用。MS 完全重写了 SDK。如果您使用旧版本并更新它,这有点烦人。下面的代码应该在新版本中工作。
from azure.storage.blob import ContainerClient
from io import StringIO
import pandas as pd
conn_str = ""
container = ""
blob_name = ""
container_client = ContainerClient.from_connection_string(
conn_str=conn_str,
container_name=container
)
# Download blob as StorageStreamDownloader object (stored in memory)
downloaded_blob = container_client.download_blob(blob_name)
df = pd.read_csv(StringIO(downloaded_blob.content_as_text()))
Run Code Online (Sandbox Code Playgroud)
我想你想使用get_blob_to_bytes
,or get_blob_to_text
; 这些应该输出一个字符串,您可以使用它来创建一个数据框
from io import StringIO
blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME)
df = pd.read_csv(StringIO(blobstring))
Run Code Online (Sandbox Code Playgroud)
Working as on 12th June 2022
步骤 1:
首先通过右键单击 blob/存储 CSV 文件(blob 文件),为 Azure 存储上的目标 CSV(blob)文件生成 SAS 令牌和 URL。
步骤 2:复制Blob SAS URL
用于生成 SAS 令牌和 URL 的按钮下方显示的 。
步骤 3:在 Jupyter 记事本中使用以下代码行导入所需的 CSV。将值替换url
为您Blob SAS URL
在上述步骤中复制的值。
import pandas as pd
url ='Your Blob SAS URL'
df = pd.read_csv(url)
df.head()
Run Code Online (Sandbox Code Playgroud)
小智 5
感谢您的回答,我认为需要进行一些更正。您需要从blob对象获取内容,并且在get_blob_to_text中不需要本地文件名。
from io import StringIO
blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME).content
df = pd.read_csv(StringIO(blobstring))
Run Code Online (Sandbox Code Playgroud)