171 votes

fonctionnalité de type sprintf en Python

J'aimerais créer un tampon de chaîne de caractères pour effectuer de nombreux traitements, formater et enfin écrire le tampon dans un fichier texte en utilisant une méthode de style C. sprintf en Python. À cause des instructions conditionnelles, je ne peux pas les écrire directement dans le fichier.

par exemple, un pseudo-code :

sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)

Ainsi, dans le fichier de sortie, nous avons ce genre d'o/p :

A= foo B= bar
C= ded
etc...

Edit, pour clarifier ma question :
buf est un grand tampon contenant toutes ces chaînes de caractères qui ont été formatées en utilisant sprintf. D'après vos exemples, buf ne contiendra que les valeurs actuelles, pas les anciennes. Par exemple, la première dans buf J'ai écrit A= something ,B= something plus tard C= something a été ajouté dans le même buf mais dans vos réponses Python buf contient seulement la dernière valeur, ce qui n'est pas ce que je veux - je veux buf pour avoir tous les printf comme je l'ai fait depuis le début, comme en C .

1 votes

Ce n'est pas comme ça que sprintf() fonctionne en C. (Il écrit le contenu au début de la ligne buf pas à la fin). Le mieux serait probablement d'utiliser un tableau de chaînes de caractères, puis de les réunir avant d'écrire dans le fichier.

0 votes

@dividebyzero N'est-ce pas trivial en Python qui est un langage de programmation général ? Par exemple, voir La solution de Michael J. Barber (posté après votre commentaire). def sprintf(buf, fmt, *args): ...

0 votes

@jdk1.0 Je ne sais pas ce que je voulais dire, j'étais un jeune et naïf programmeur Python... Cette question est en fait bizarre parce que cette histoire de réutilisation de tampon n'est pas si simple, il faudrait incrémenter un pointeur avec la sortie de chaque appel sprintf, et ce genre de chose n'est pas quelque chose dont vous devriez vous soucier si vous faites du Python. Bref, je suis content d'être passé à Scala et maintenant à Julia !

206voto

android Points 2949

Python dispose d'un % opérateur pour cela.

>>> a = 5
>>> b = "hello"
>>> buf = "A = %d\n , B = %s\n" % (a, b)
>>> print buf
A = 5
 , B = hello

>>> c = 10
>>> buf = "C = %d\n" % c
>>> print buf
C = 10

Voir ceci référence pour tous les spécificateurs de format pris en charge.

Vous pourriez aussi bien utiliser format :

>>> print "This is the {}th tome of {}".format(5, "knowledge")
This is the 5th tome of knowledge

45voto

Bethor Points 2997

Si je comprends bien votre question, format() est ce que vous recherchez, ainsi que son mini-langage .

Exemple idiot pour python 2.7 et plus :

>>> print "{} ...\r\n {}!".format("Hello", "world")
Hello ...
 world!

Pour les versions antérieures de python : (testé avec 2.6.2)

>>> print "{0} ...\r\n {1}!".format("Hello", "world")
Hello ...
 world!

4 votes

Vous devriez probablement noter que cette version ne fonctionne que dans Python 3. Dans Python 2.6, par exemple, vous devez faire : "{0} ...\r\n {1}!".format("Hello", "world")

1 votes

J'ai modifié ma réponse pour inclure cela ; ne pas oublier que cela fonctionne aussi pour python 2.7 !

27voto

Michael J. Barber Points 12837

Je ne suis pas tout à fait certain de comprendre votre objectif, mais vous pouvez utiliser une StringIO en tant que tampon :

>>> import StringIO 
>>> buf = StringIO.StringIO()
>>> buf.write("A = %d, B = %s\n" % (3, "bar"))
>>> buf.write("C=%d\n" % 5)
>>> print(buf.getvalue())
A = 3, B = bar
C=5

Contrairement à sprintf vous passez simplement une chaîne de caractères à buf.write en le formatant avec le % ou l'opérateur format de chaînes de caractères.

Vous pourriez bien sûr définir une fonction permettant d'obtenir l'information suivante sprintf l'interface que vous espérez :

def sprintf(buf, fmt, *args):
    buf.write(fmt % args)

qui serait utilisé comme suit :

>>> buf = StringIO.StringIO()
>>> sprintf(buf, "A = %d, B = %s\n", 3, "foo")
>>> sprintf(buf, "C = %d\n", 5)
>>> print(buf.getvalue())
A = 3, B = foo
C = 5

2 votes

+1 pour m'avoir montré comment utiliser *args avec l'opérateur de formatage de chaîne (%).

3 votes

Pour Python3, utilisez io.StringIO() au lieu de

18voto

NPE Points 169956

Utilisez le opérateur de formatage % : buf = "A = %d \n , B= %s \n " % (a, b) imprimer >>f, buf

11voto

utdemir Points 9107

Vous pouvez utiliser le formatage des chaînes de caractères :

>>> a=42
>>> b="bar"
>>> "The number is %d and the word is %s" % (a,b)
'The number is 42 and the word is bar'

Mais cela a été supprimé dans Python 3, vous devez utiliser "str.format()" :

>>> a=42
>>> b="bar"
>>> "The number is {0} and the word is {1}".format(a,b)
'The number is 42 and the word is bar'

6 votes

Faux, il n'est pas supprimé dans Python 3. Python 3.0 disait qu'il serait déprécié en 3.1 mais je crois que cela n'est jamais arrivé. Utilisation de format() peut être préférable mais % Le formatage existe toujours. (Voir mail.python.org/pipermail/python-dev/2009-septembre/092399.html pour connaître les raisons pour lesquelles il n'a pas été déprécié).

1 votes

@Duncan ; merci, je ne le savais pas. J'ai lu quelque part que c'était déprécié et je n'ai plus jamais essayé :).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X