Python 如何逐行读取azure blob?

Python 如何逐行读取azure blob?,python,azure,azure-storage-blobs,Python,Azure,Azure Storage Blobs,我在容器中工作,以抵抗相当大的斑点。数据是日志数据,每行数kb。我希望BlockBlobService.get_blob_to_stream像流一样运行,但它会下载整个内容。我怎样才能真正地流式传输blob ala: with some_method as blobStream: for line in blobStream: <do something with line> 使用某些_方法作为blobStream: 对于blobStream中的行: 出于我的需要,我无法

我在容器中工作,以抵抗相当大的斑点。数据是日志数据,每行数kb。我希望BlockBlobService.get_blob_to_stream像流一样运行,但它会下载整个内容。我怎样才能真正地流式传输blob ala:

with some_method as blobStream:
for line in blobStream:
    <do something with line>
使用某些_方法作为blobStream:
对于blobStream中的行:

出于我的需要,我无法下载整个流或将其保存在内存中,我一次只需要一行。

因此,不存在能够让您逐行读取blob的功能。你需要想出自己的解决方案

然而,当使用该方法时,您当然可以读取blob的部分内容。如果您看到此方法的签名:

def get_blob_to_stream(
        self, container_name, blob_name, stream, snapshot=None,
        start_range=None, end_range=None, validate_content=False,
        progress_callback=None, max_connections=2, lease_id=None,
        if_modified_since=None, if_unmodified_since=None, if_match=None,
        if_none_match=None, timeout=None):
您会注意到它有两个参数(
start\u range
end\u range
)。这两个参数将使您能够读取部分blob内容,而不是读取整个blob


您可以做的是读取一块数据(比如说一次读取1MB),然后构建一些逻辑来逐行分解这些数据

因此,不存在能够让您逐行读取blob的功能。你需要想出自己的解决方案

然而,当使用该方法时,您当然可以读取blob的部分内容。如果您看到此方法的签名:

def get_blob_to_stream(
        self, container_name, blob_name, stream, snapshot=None,
        start_range=None, end_range=None, validate_content=False,
        progress_callback=None, max_connections=2, lease_id=None,
        if_modified_since=None, if_unmodified_since=None, if_match=None,
        if_none_match=None, timeout=None):
您会注意到它有两个参数(
start\u range
end\u range
)。这两个参数将使您能够读取部分blob内容,而不是读取整个blob


您可以做的是读取一块数据(比如说一次读取1MB),然后构建一些逻辑来逐行分解这些数据

我将blob设置为public并执行以下操作,因为它是文本。虽然不是很理想,但它完成了任务

import urllib.request

for line in urllib.request.urlopen(blob_url):
    <do something with line>
导入urllib.request
对于urllib.request.urlopen(blob_url)中的行:
编辑

我不得不面对的一个问题是插座丢失,因为我正在对付一个带电的水滴。我必须拍摄一张快照并使用会话,否则在大约5秒钟的处理后,我将触发断开连接

snapshotBlob = append_blob_service.snapshot_blob(container, blobName)

_params = {
    'snapshot': snapshotBlob.snapshot,
    'timeout': 20000,
}

s = requests.Session()

r = s.get(target_url, params=_params, stream=True, timeout=20000)

for line in in r.iter_lines():
    <do something with line>
snapshotBlob=append\u blob\u服务。snapshot\u blob(容器,blobName)
_参数={
“快照”:snapshotBlob.snapshot,
“超时”:20000,
}
s=请求。会话()
r=s.get(target_url,params=_params,stream=True,timeout=20000)
对于r.iter_线()中的线:

我将blob设置为public并执行以下操作,因为它是文本。虽然不是很理想,但它完成了任务

import urllib.request

for line in urllib.request.urlopen(blob_url):
    <do something with line>
导入urllib.request
对于urllib.request.urlopen(blob_url)中的行:
编辑

我不得不面对的一个问题是插座丢失,因为我正在对付一个带电的水滴。我必须拍摄一张快照并使用会话,否则在大约5秒钟的处理后,我将触发断开连接

snapshotBlob = append_blob_service.snapshot_blob(container, blobName)

_params = {
    'snapshot': snapshotBlob.snapshot,
    'timeout': 20000,
}

s = requests.Session()

r = s.get(target_url, params=_params, stream=True, timeout=20000)

for line in in r.iter_lines():
    <do something with line>
snapshotBlob=append\u blob\u服务。snapshot\u blob(容器,blobName)
_参数={
“快照”:snapshotBlob.snapshot,
“超时”:20000,
}
s=请求。会话()
r=s.get(target_url,params=_params,stream=True,timeout=20000)
对于r.iter_线()中的线:

您可以在中使用
Range
x-ms-Range
仅返回指定范围内的blob字节

您可以通过Python存储SDK中的
start\u range
end\u range
参数来实现它

例如,将一个1GB blob文件拆分为100个请求,每单位时间发送100个请求,然后将其下载到本地文件中进行后续处理。请确保写入的字节位置正确。但这需要系统有1GB的内存空间供其使用

建议采用更优化的方法,即在下载满足
配额的每个容量时,可以同时将日志文件读入内存

例如,blob被划分为100个请求,每单位时间发送5个请求。按顺序运行20次。每5个请求写入内存,同时发送以下5个请求。这样,系统只需分配大约
的内存空间配额

鉴于网络不稳定导致请求中断需要在字节的请求范围内重写,我建议您将文件分成更多部分


希望它能对您有所帮助。

您可以在中使用
Range
x-ms-Range
仅返回指定范围内的blob字节

您可以通过Python存储SDK中的
start\u range
end\u range
参数来实现它

例如,将一个1GB blob文件拆分为100个请求,每单位时间发送100个请求,然后将其下载到本地文件中进行后续处理。请确保写入的字节位置正确。但这需要系统有1GB的内存空间供其使用

建议采用更优化的方法,即在下载满足
配额的每个容量时,可以同时将日志文件读入内存

例如,blob被划分为100个请求,每单位时间发送5个请求。按顺序运行20次。每5个请求写入内存,同时发送以下5个请求。这样,系统只需分配大约
的内存空间配额

鉴于网络不稳定导致请求中断需要在字节的请求范围内重写,我建议您将文件分成更多部分


希望对您有所帮助。

您是否尝试过使用
StringIO
将blobstream读取为字符串?每行的内容是否具有固定的字符数?内容是否具有固定的长度。不幸的是,StringIO本身并不能帮助解决这个问题,因为get_blob_to_流只需一次将整个内容下载到输出流中。此外,它必须是字节流。您是否尝试过使用
StringIO
将blobstream作为字符串读取?的内容是