2015-07-15 2 views
2

J'utilise une bibliothèque python tiers qui crée .svg (spécifiquement pour les arbres évolutifs) qui a une fonction render pour les objets arbre. Ce que je veux, c'est le svg sous forme de chaîne que je peux éditer. Actuellement, je sauve le svg et lire le fichier comme suit:Sauver svg à tempfile Python

tree.render('location/filename.svg', other_args...) 
f = open('location/filename.svg', "r") 
svg_string = f.read() 
f.close() 

Cela fonctionne, mais est-il possible d'utiliser un fichier temporaire à la place? Jusqu'à présent, j'ai:

t = tempfile.NamedTemporaryFile() 
tmpdir = tempfile.mkdtemp() 
t.name = os.path.join(tmpdir, 'tmp.svg') 
tree.render(t.name, other_args...) 
svg_string = t.read() 
t.close() 

Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas et/ou comment je pouvais le faire sans créer un fichier (que je viens de supprimer plus tard). Le svg_string Je continue à modifier pour une utilisation dans une application django.

EDIT: Important: la fonction de rendu peut également être utilisée pour créer d'autres types de fichiers, par ex. .png - l'extension .svg doit donc être spécifiée.

Répondre

3

Vous ne devez pas définir vous-même le nom de votre fichier temporaire. Lorsque vous le créez, le nom sera généré de manière aléatoire. Vous pouvez l'utiliser directement.

t = tempfile.NamedTemporaryFile() 
tree.render(t.name, other_args...) 
t.file.seek(0) #reset the file pointer to the beginning 
svg_string = t.read() 
t.close() 
+0

Belle réponse mais j'ai réalisé que j'avais oublié une information importante, vérifiez le montage. Si je le fais à votre façon, le 't.read()' est juste vide lorsque je l'imprime. – edc505

+0

Pour l'extension, vous pouvez utiliser le paramètre 'suffix'. 't = tempfile.NamedTemporaryFile (suffixe =". svg ")'. Si 't.read()' est vide, avez-vous essayé avec la ligne 't.file.seek (0)'? – Patrick

+0

Cela a fait l'affaire! Le '' t.read() '' n'était vide que parce que la fonction de rendu ne fonctionnait pas sans l'extension. Fonctionne parfaitement si vous ajoutez le suffixe de la manière que vous décrivez. – edc505