python écrire chaîne directement à tarfile
Est-il un moyen d'écrire une chaîne de caractères directement à un tarfile? De http://docs.python.org/library/tarfile.html il semble que seuls les fichiers déjà écrit sur le système de fichiers peuvent être ajoutés.
Vous devez vous connecter pour publier un commentaire.
Je dirais que c'est possible, en jouant avec TarInfo e TarFile.addfile le passage d'un StringIO comme un fileobject.
Très rugueuse, mais qui fonctionne
len()
fonction, de sorte quetarfile.copyfileobj
fonction échouera avecraise OSError("end of file reached")
Que Stefano a souligné, vous pouvez utiliser
TarFile.addfile
etStringIO
.Vous aurez probablement envie de remplir les autres champs de
tarinfo
(par exemplemtime
,uname
etc.) ainsi.J'ai trouvé cette recherche comment servir dans Django juste créé dans la mémoire .archive tgz, peut-être quelqu'un d'autre va trouver mon code utile:
Juste pour le record:
StringIO les objets ont une .len propriété.
Pas besoin de chercher(0) et ne len(foo.buf)
Pas besoin de garder l'ensemble de la chaîne de autour de faire de len (), ou à Dieu ne plaise, faire la comptabilité de vous-même.
( Peut-être qu'il n'avait pas, au moment de l'OP a été écrit. )
Vous devez utiliser TarInfo objets et la méthode addfile au lieu de l'habituelle méthode add:
Dans mon cas, je voulais lire depuis un fichier tar, ajouter des données pour le contenu, et l'écrire dans un nouveau fichier. Quelque chose comme:
Code supplémentaire est nécessaire pour la manutention des répertoires et des liens.
La solution en Python 3 utilise
io.BytesIO
. Assurez-vous de définirTarInfo.size
à la longueur des octets, et non pas la longueur de la chaîne.Donné une chaîne unique, la solution la plus simple est d'appeler
.encode()
sur elle pour obtenir des octets. En cette journée et l'âge, vous voulez probablement UTF-8, mais si la personne qui s'attend à un codage spécifique, comme ASCII (pas de caractères multi-octets), puis l'utiliser à la place.Si vous avez vraiment besoin d'une écriture chaîne tampon, semblable à la accepté de répondre par @Stefano Borini pour Python 2, alors la solution est d'utiliser
io.TextIOWrapper
sur un sous-jacentio.BytesIO
tampon.