Comment puis-je utiliser boto, pour diffuser un fichier à partir d'Amazon S3 pour Rackspace Cloudfiles?
Je suis la copie d'un fichier à partir de S3 à Cloudfiles, et je voudrais éviter d'écrire le fichier sur le disque. Python-Cloudfiles bibliothèque a un objet.stream() appel qui ressemble à ce dont j'ai besoin, mais je ne peux pas trouver un équivalent appel dans boto. J'espère que je serais capable de faire quelque chose comme:
shutil.copyfileobj(s3Object.stream(),rsObject.stream())
Est-ce possible avec boto (ou je suppose que tout autre s3 bibliothèque)?
Le smart_open bibliothèque Python fait que (à la fois pour la lecture et l'écriture).
OriginalL'auteur joemastersemison | 2011-10-02
Vous devez vous connecter pour publier un commentaire.
L'objet Clé dans le nom de boto, ce qui représente sur l'objet en S3, peut être utilisé comme un itérateur de sorte que vous devriez être en mesure de faire quelque chose comme ceci:
Ou, comme dans le cas de votre exemple, vous pourriez faire:
S3.L'objet n'est pas itérable plus.
OriginalL'auteur garnaat
D'autres réponses dans ce thread sont liées à boto, mais S3.L'objet n'est pas itérable plus en boto3. Ainsi, le code suivant NE fonctionne PAS, il se produit une
TypeError: 's3.Object' object is not iterable
message d'erreur:Dans boto3, le contenu de l'objet est disponible à
S3.Object.get()['Body']
qui n'est pas un objet iterable, donc la suite NE fonctionne toujours PAS:Donc, une alternative est d'utiliser la méthode de lecture, mais cette charge l'ENSEMBLE S3 objet en mémoire lorsque vous traitez avec de gros fichiers n'est pas toujours une possibilité:
Mais la
read
méthode permet de passer dans leamt
paramètre indiquant le nombre d'octets que nous voulons pour lire le flux sous-jacent. Cette méthode peut être appelé à plusieurs reprises jusqu'à ce que le flux a été lu:De creuser dans
botocore.response.StreamingBody
code on se rend compte que le flux sous-jacent est également disponible, afin que nous puissions effectuer une itération comme suit:Pendant googler j'ai aussi vu quelques liens qui pourraient être utiliser, mais je n'ai pas essayé:
OriginalL'auteur smallo
Je figure au moins certaines des personnes qui ont vu cette question sera comme moi, et veulent un moyen de diffuser un fichier à partir boto ligne par ligne (ou la virgule par virgule, ou tout autre délimiteur). Voici une façon simple de le faire:
@garnaat la réponse ci-dessus est encore grand et vrai à 100%. Espérons que la mienne toujours en aide à quelqu'un.
lines = re.split(r'[\n\r]+', byte)
- utile pour les fichiers CSV exportés à partir d'Excelencore une remarque: j'ai dû ajouter
yield unfinished_line
après lafor byte in f:
boucle est terminée, sinon, la dernière ligne ne sont pas traitésEst-il une bonne raison pour laquelle ce n'est pas une partie de la Boto3 API? Si non, doit-on soumettre une demande d'extraction de résoudre ce problème? Je serais super bas pour frapper quelque chose comme ça!
heureux de vous avoir à faire, si vous le souhaitez.
Permet de voir comment ce pull request va plus à botocore: github.com/boto/botocore/pull/1034
OriginalL'auteur Eli
C'est ma solution d'emballage de streaming corps:
Exemple d'utilisation:
OriginalL'auteur jzhou
Botocore de
StreamingBody
a uniter_lines()
méthode:https://botocore.amazonaws.com/v1/documentation/api/latest/reference/response.html#botocore.response.StreamingBody.iter_lines
Donc:
OriginalL'auteur Vic