Je voudrais créer un tampon de chaîne pour faire beaucoup de traitement, formater et enfin écrire le tampon dans un fichier texte en utilisant une sprintf
fonctionnalité de style C en Python. En raison des instructions conditionnelles, je ne peux pas les écrire directement dans le fichier.
par exemple pseudo code:
sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)
Donc, dans le fichier de sortie, nous avons ce type d'o / p:
A= foo B= bar
C= ded
etc...
Edit, pour clarifier ma question:
buf
est un gros tampon contient toutes ces chaînes qui ont été formatées à l'aide de sprintf. En suivant vos exemples, buf
ne contiendra que les valeurs actuelles, pas les plus anciennes. par exemple, le premier dans buf
j'ai écrit A= something ,B= something
plus tard a C= something
été ajouté dans le même buf
, mais dans vos réponses Python buf
ne contient que la dernière valeur, ce que je ne veux pas - je veux buf
avoir tout ce que printf
j'ai fait depuis le début, comme dans C
.
buf
, pas à la fin.) Il serait probablement préférable d'utiliser un tableau de chaînes, puis de les joindre avant d'écrire dans le fichier.def sprintf(buf, fmt, *args): ...
Réponses:
Python a un
%
opérateur pour cela.Consultez cette référence pour tous les spécificateurs de format pris en charge.
Vous pouvez également utiliser
format
:la source
Si je comprends bien votre question, le format () est ce que vous recherchez, avec son mini-langage .
Exemple idiot pour python 2.7 et plus:
Pour les versions antérieures de python: (testé avec 2.6.2)
la source
"{0} ...\r\n {1}!".format("Hello", "world")
Je ne suis pas tout à fait certain de comprendre votre objectif, mais vous pouvez utiliser une
StringIO
instance comme tampon:Contrairement à
sprintf
, vous passez simplement une chaîne àbuf.write
, en la formatant avec l'%
opérateur ou laformat
méthode des chaînes.Vous pouvez bien sûr définir une fonction pour obtenir l'
sprintf
interface que vous espérez:qui serait utilisé comme ceci:
la source
io.StringIO()
placeUtilisez l' opérateur de mise en forme
%
:la source
Vous pouvez utiliser le formatage de chaîne:
Mais cela est supprimé dans Python 3, vous devez utiliser "str.format ()":
la source
format()
peut être préférable mais le%
formatage existe toujours. (Voir mail.python.org/pipermail/python-dev/2009-September/092399.html pour une partie des raisons pour lesquelles il n'était pas obsolète)Pour insérer dans une très longue chaîne, il est agréable d'utiliser des noms pour les différents arguments, au lieu d'espérer qu'ils sont aux bonnes positions. Cela facilite également le remplacement de plusieurs récurrences.
Tiré d' exemples de format , où toutes les autres
Format
réponses liées sont également affichées.la source
C'est probablement la traduction la plus proche de votre code C en code Python.
L'
%
opérateur en Python fait presque exactement la même chose que C desprintf
. Vous pouvez également imprimer la chaîne directement dans un fichier. S'il y a beaucoup de ces stringlets formatés en chaîne, il peut être judicieux d'utiliser unStringIO
objet pour accélérer le temps de traitement.Alors au lieu de faire
+=
, faites ceci:la source
Si vous voulez quelque chose comme la fonction d'impression python3 mais à une chaîne:
ou sans le
'\n'
à la fin:la source
Quelque chose comme...
la source
Jetez un œil à "Interpolation de chaîne littérale" https://www.python.org/dev/peps/pep-0498/
Je l'ai trouvé sur http://www.malemburg.com/
la source
Deux approches consistent à écrire dans un tampon de chaîne ou à écrire des lignes dans une liste et à les joindre plus tard. Je pense que l'
StringIO
approche est plus pythonique, mais n'a pas fonctionné avant Python 2.6.Vous pouvez également les utiliser sans
ContextMananger
(s = StringIO()
). Actuellement, j'utilise une classe de gestionnaire de contexte avec uneprint
fonction. Ce fragment peut être utile pour pouvoir insérer des exigences de débogage ou de pagination étranges:la source