Saltar al contenido

¿Cómo acceder a los archivos dentro de las subcarpetas de un GCS de depósito usando Python?

Nuestros mejores desarrolladores han agotado sus depósitos de café, por su búsqueda a tiempo completo por la solución, hasta que Alexandría halló el arreglo en Bitbucket así que en este momento la compartimos aquí.

Solución:

Lo que te perdiste es el hecho de que en GCS los objetos en un depósito no están organizados en una estructura/jerarquía de directorios similar a un sistema de archivos, sino en una estructura plana.

Puede encontrar una explicación más detallada en Cómo funcionan los subdirectorios (en el gsutil contexto, truepero la razón fundamental es la misma: el espacio de nombres planos de GCS):

Gsutil proporciona la ilusión de un árbol de archivos jerárquicos sobre el espacio de nombre “plana” compatible con el servicio de almacenamiento de Google Cloud. Al servicio, el objeto GS: //your-bucket/abc/def.txt es solo un objeto que le sucede a “/” caracteres en su nombre. No existe un directorio “abc”; Sólo un solo objeto con el nombre dado.

Ya que no hay directorios (sub) directorios en GCS entonces /training/bad Realmente no existe, por lo que no puede enumerar su contenido. Todo lo que puede hacer es enumerar todos los objetos en el cubo y seleccionar los nombres / rutas que comienzan con /training/bad.

Si desea encontrar manchas (archivos) que existen bajo un determinado prefix (subdirectorio) puede especificar prefix y delimiter argumentos a la list_blobs() función

Vea el siguiente ejemplo tomado del ejemplo de Google Listing Objects (también fragmento de GitHub)

def list_blobs_with_prefix(bucket_name, prefix, delimiter=None):
    """Lists all the blobs in the bucket that begin with the prefix.

    This can be used to list all blobs in a "folder", e.g. "public/".

    The delimiter argument can be used to restrict the results to only the
    "files" in the given "folder". Without the delimiter, the entire tree under
    the prefix is returned. For example, given these blobs:

        /a/1.txt
        /a/b/2.txt

    If you just specify prefix = '/a', you'll get back:

        /a/1.txt
        /a/b/2.txt

    However, if you specify prefix='/a' and delimiter='/', you'll get back:

        /a/1.txt

    """
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)

    blobs = bucket.list_blobs(prefix=prefix, delimiter=delimiter)

    print('Blobs:')
    for blob in blobs:
        print(blob.name)

    if delimiter:
        print('Prefixes:')
        for prefix in blobs.prefixes:
            print(prefix)

Si tienes alguna cuestión y disposición de acrecentar nuestro artículo puedes ejecutar una referencia y con mucho gusto lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *