2011-02-14 9 views
16

Quiero escribir una secuencia de comandos de Python que leerá y escribirá archivos desde s3 utilizando sus direcciones URL, por ejemplo: 's3:/mybucket/file'. Tendría que ejecutarse localmente y en la nube sin ningún cambio de código. ¿Hay alguna forma de hacer esto?¿Cómo puedo acceder a los archivos s3 en Python usando urls?

Editar: Hay algunas buenas sugerencias aquí, pero lo que realmente quiero es algo que me permite hacer esto:

myfile = open("s3://mybucket/file", "r") 

y luego utilizar ese objeto de archivo como cualquier otro objeto de archivo. Eso sería genial. Podría escribir algo como esto para mí si no existe. Podría construir esa capa de abstracción en simples3 o boto.

+0

¿necesita que los archivos sean privados o simplemente el más simple? –

+0

No es necesario que sean privados. Solo quiero poder usar URL para acceder a ellos en mi código. Creo que lo que realmente estoy buscando es una capa de abstracción que me permita trabajar con archivos usando URL, ya sea una biblioteca de Python o algo así como FUSE, pero que admite direcciones URL en lugar de rutas de archivos locales. –

Respuesta

2

No he visto algo que funcione directamente con las direcciones URL S3, pero se puede usar un S3 access library (simples3 ve decente) y algunos sencilla manipulación de cadenas:

>>> url = "s3:/bucket/path/" 
>>> _, path = url.split(":", 1) 
>>> path = path.lstrip("/") 
>>> bucket, path = path.split("/", 1) 
>>> print bucket 
'bucket' 
>>> print path 
'path/' 
+0

Eso es lo que estoy pensando. Además de resolver la ruta s3 quizás algunas rutinas adicionales para leer/escribir en cubos abstractos. –

1

Se puede utilizar para acceder a Boto Python API S3 pitón. Es una buena biblioteca. Después de hacer la instalación de Boto, después programe la muestra funcionará para usted

>>> k = Key(b) 
>>> k.key = 'yourfile' 
>>> k.set_contents_from_filename('yourfile.txt') 

Puede encontrar más información aquí http://boto.cloudhackers.com/s3_tut.html#storing-data

+0

La pregunta es sobre el uso de URL que comienzan con s3: // o no (archivos locales), de modo que el programa Python pueda acceder a S3 y a un sistema de archivos local de manera uniforme. – EOL

1

http://s3tools.org/s3cmd funciona bastante bien y apoyar el s3: // forma de la estructura de URL que querer. Hace negocios en Linux y Windows. Si necesita una API nativa para llamar desde dentro de un programa python, entonces http://code.google.com/p/boto/ es una mejor opción.

+1

Uso s3cmd desde la línea de comandos (uso interactivo/manual) todo el tiempo; es una buena herramienta. Sin embargo, tenga en cuenta que no se comporta como una herramienta de línea de comandos normal de Unix: no devuelve un código de error que indique que se ha producido un error o que se ha producido un error, por lo que no se puede utilizar en secuencias de comandos. –

10

Para la apertura, debe ser tan simple como:

import urllib 
opener = urllib.URLopener() 
myurl = "https://s3.amazonaws.com/skyl/fake.xyz" 
myfile = opener.open(myurl) 

Esto funciona con s3 si el archivo es público.

Para escribir un archivo usando boto, que va un poco algo como esto:

from boto.s3.connection import S3Connection 
conn = S3Connection(AWS_KEY, AWS_SECRET) 
bucket = conn.get_bucket(BUCKET) 
destination = bucket.new_key() 
destination.name = filename 
destination.set_contents_from_file(myfile) 
destination.make_public() 

déjame saber si esto funciona para usted :)

3

Here's how they do en awscli:

def find_bucket_key(s3_path): 
    """ 
    This is a helper function that given an s3 path such that the path is of 
    the form: bucket/key 
    It will return the bucket and the key represented by the s3 path 
    """ 
    s3_components = s3_path.split('/') 
    bucket = s3_components[0] 
    s3_key = "" 
    if len(s3_components) > 1: 
     s3_key = '/'.join(s3_components[1:]) 
    return bucket, s3_key 


def split_s3_bucket_key(s3_path): 
    """Split s3 path into bucket and key prefix. 
    This will also handle the s3:// prefix. 
    :return: Tuple of ('bucketname', 'keyname') 
    """ 
    if s3_path.startswith('s3://'): 
     s3_path = s3_path[5:] 
    return find_bucket_key(s3_path) 

que podría usar con un código como este

from awscli.customizations.s3.utils import split_s3_bucket_key 
import boto3 
client = boto3.client('s3') 
bucket_name, key_name = split_s3_bucket_key(
    's3://example-bucket-name/path/to/example.txt') 
response = client.get_object(Bucket=bucket_name, Key=key_name) 

Esto no aborda el objetivo de interactuar con una clave s3 como file like object, pero es un paso en esa dirección.

Cuestiones relacionadas