Как прочитать только первый ряд CSV из Google Cloud Storage? - PullRequest
0 голосов
/ 06 декабря 2018

Я видел этот вопрос: Как прочитать первые 2 строки CSV из Google Cloud Storage

Но в моем случае я не хочу загружать весь бланк CSV в память, как это может быть огромным.Есть ли способ открыть его как некоторый повторяемый (или файлоподобный объект) и читать только байты первой пары строк?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Хотелось расширить ответ симз на примере того, как создать итерацию в тех случаях, когда мы не знаем размер заголовка CSV.Также может быть полезно для чтения CSV из хранилища данных построчно:

def get_csv_header(blob):
    for line in csv.reader(blob_lines(blob)):
        return line


# How much bytes of blob download using one request.
# Selected experimentally. If there is more optimal value for this - please update.
BLOB_CHUNK_SIZE = 2000


def blob_lines(blob: storage.blob.Blob) -> Generator[str, None, None]:
    position = 0
    buff = []
    while True:
        chunk = blob.download_as_string(start=position, end=position + BLOB_CHUNK_SIZE).decode()
        if '\n' in chunk:
            part1, part2 = chunk.split('\n', 1)
            buff.append(part1)
            yield ''.join(buff)
            parts = part2.split('\n')
            for part in parts[:-1]:
                yield part
            buff = [parts[-1]]
        else:
            buff.append(chunk)

        position += BLOB_CHUNK_SIZE + 1  # Blob chunk is downloaded using closed interval
        if len(chunk) < BLOB_CHUNK_SIZE:
            yield ''.join(buff)
            return
0 голосов
/ 06 декабря 2018

API для google.cloud.storage.blob.Blob указывает, что метод download_as_string имеет ключевые слова start и end, которые предоставляют диапазоны байтов:

https://googleapis.github.io/google-cloud-python/latest/storage/blobs.html#google.cloud.storage.blob.Blob

...