Que signifie% s dans une chaîne au format python?

167

Que %ssignifie en Python? Et que fait le morceau de code suivant?

Par exemple...

 if len(sys.argv) < 2:
     sys.exit('Usage: %s database-name' % sys.argv[0])

 if not os.path.exists(sys.argv[1]):
     sys.exit('ERROR: Database %s was not found!' % sys.argv[1])
Tyler
la source
4
L' %opérateur est déconseillé au profit de la str.formatméthode la plus puissante , voir PEP-3101 .
Paulo Scardine
35
En fait, PEP dit: "En Python 3.0, l'opérateur% est complété par une méthode de formatage de chaîne plus puissante" et qu'il est rétroporté vers Python 2.6. D'où je viens, «complété» signifie ajouté, non remplacé. Le PEP ne dit pas «supplanté» et dans aucune partie du PEP il ne dit que l'opérateur% est obsolète (pourtant il dit que d'autres choses sont obsolètes en bas). Vous pourriez préférer str.format et c'est bien, mais tant qu'il n'y a pas de PEP disant qu'il est obsolète, il n'y a aucun sens à prétendre que c'est quand ce n'est pas le cas.
Ben

Réponses:

199

Il s'agit d'une syntaxe de formatage de chaîne (qu'elle emprunte à C).

Veuillez voir "PyFormat" :

Python prend en charge la mise en forme des valeurs en chaînes. Bien que cela puisse inclure des expressions très compliquées, l'utilisation la plus basique consiste à insérer des valeurs dans une chaîne avec l' %sespace réservé.

Edit: Voici un exemple très simple:

#Python2
name = raw_input("who are you? ")
print "hello %s" % (name,)

#Python3+
name = input("who are you? ")
print("hello %s" % (name,))

Le %sjeton me permet d'insérer (et éventuellement de formater) une chaîne. Notez que le %sjeton est remplacé par tout ce que je passe à la chaîne après le %symbole. Notez également que j'utilise également un tuple ici (lorsque vous n'avez qu'une seule chaîne en utilisant un tuple est facultatif) pour illustrer que plusieurs chaînes peuvent être insérées et formatées dans une seule instruction.

Andrew Hare
la source
11
Notez que ce type d'interpolation de chaîne est déconseillé au profit de la str.formatméthode la plus puissante .
Paulo Scardine
6
En python3, raw_input () est maintenant juste input () pour ceux d'entre vous qui essaient par eux-mêmes.
Gothburz
1
Pourquoi (name,)et pas seulement name?
Cameron Hudson
112

La réponse d'Andrew est bonne.

Et juste pour vous aider un peu plus, voici comment utiliser le formatage multiple dans une chaîne

"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".

Si vous utilisez des entiers au lieu de chaîne, utilisez% d au lieu de% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
sqram
la source
2
agréable. % d vous évite de lancer str (int). une idée de ce que représentent% s et% d? je suppose que je m'en souviendrai comme une chaîne et un chiffre.
user391339
1
@ user391339 signifie décimal :) ils sont tous ici docs.python.org/2/library/…
sqram
Je ne sais pas pour les versions antérieures, mais au moins pour la version 3.6, cela fonctionne de la même manière même si vous utilisez des %snombres entiers, il sera simplement converti en une chaîne.
lapin
@lapin vous avez raison :). mais ce n'est pas toujours ce que vous voulez. Supposons que vous souhaitiez ajouter un chiffre, par exemple. print('This number will be padded with 4 zeros: %05d ' % 1)- cela fonctionnera. print('This number will be padded with 4 zeros: %05s ' % 1)- ce ne sera pas `
sqram
28

La formatméthode a été introduite dans Python 2.6. Il est plus performant et pas beaucoup plus difficile à utiliser:

>>> "Hello {}, my name is {}".format('john', 'mike')
'Hello john, my name is mike'.

>>> "{1}, {0}".format('world', 'Hello')
'Hello, world'

>>> "{greeting}, {}".format('world', greeting='Hello')
'Hello, world'

>>> '%s' % name
"{'s1': 'hello', 's2': 'sibal'}"
>>> '%s' %name['s1']
'hello'
dansalmo
la source
11
Cette réponse serait améliorée si elle expliquait que la syntaxe de la question formait du texte et démontrait ensuite la nouvelle méthode. De cette façon, il pourrait être autonome. Fournir un exemple équivalent à l'exemple de la question serait également un plus.
Steve S
13

%sindique un type de conversion de chaîne lors de l'utilisation des capacités de formatage de chaîne de python. Plus spécifiquement, %sconvertit une valeur spécifiée en une chaîne à l'aide de la str()fonction. Comparez cela avec le %rtype de conversion qui utilise la repr()fonction de conversion de valeur.

Jetez un œil à la documentation pour le formatage des chaînes .

Brandon E Taylor
la source
13

%set %dsont des spécificateurs de format ou des espaces réservés pour le formatage des chaînes / décimales / flottants, etc.

Spécificateur de format le plus couramment utilisé:

%s : chaîne

%d : décimales

%f : flotter

Code explicite:

name = "Gandalf"
extendedName = "the Grey"
age = 84
IQ = 149.9
print('type(name):', type(name)) #type(name): <class 'str'>
print('type(age):', type(age))   #type(age): <class 'int'>   
print('type(IQ):', type(IQ))     #type(IQ): <class 'float'>   

print('%s %s\'s age is %d with incredible IQ of %f ' %(name, extendedName, age, IQ)) #Gandalf the Grey's age is 84 with incredible IQ of 149.900000 

#Same output can be printed in following ways:


print ('{0} {1}\'s age is {2} with incredible IQ of {3} '.format(name, extendedName, age, IQ))          # with help of older method
print ('{} {}\'s age is {} with incredible IQ of {} '.format(name, extendedName, age, IQ))          # with help of older method

print("Multiplication of %d and %f is %f" %(age, IQ, age*IQ)) #Multiplication of 84 and 149.900000 is 12591.600000          

#storing formattings in string

sub1 = "python string!"
sub2 = "an arg"

a = "i am a %s" % sub1
b = "i am a {0}".format(sub1)

c = "with %(kwarg)s!" % {'kwarg':sub2}
d = "with {kwarg}!".format(kwarg=sub2)

print(a)    # "i am a python string!"
print(b)   # "i am a python string!"
print(c)    # "with an arg!"
print(d)   # "with an arg!"
Om Sao
la source
6

En réponse à votre deuxième question: que fait ce code? ...

Il s'agit d'un code de vérification d'erreur assez standard pour un script Python qui accepte les arguments de ligne de commande.

Donc, la première ifdéclaration se traduit par: si vous ne m'avez pas passé d'argument, je vais vous dire comment vous devriez me transmettre un argument à l'avenir, par exemple, vous verrez ceci à l'écran:

Usage: myscript.py database-name

L' ifinstruction suivante vérifie si le 'nom de la base de données' que vous avez passé au script existe réellement sur le système de fichiers. Sinon, vous recevrez un message comme celui-ci:

ERROR: Database database-name was not found!

De la documentation :

argv [0] est le nom du script (cela dépend du système d'exploitation, qu'il s'agisse d'un chemin complet ou non). Si la commande a été exécutée à l'aide de l'option de ligne de commande -c vers l'interpréteur, argv [0] est défini sur la chaîne «-c». Si aucun nom de script n'a été passé à l'interpréteur Python, argv [0] est la chaîne vide.

viande_mécanique
la source
2

Voici un bon exemple en Python3.

  >>> a = input("What is your name?")
  What is your name?Peter

  >>> b = input("Where are you from?")
  Where are you from?DE

  >>> print("So you are %s of %s" % (a, b))
  So you are Peter of DE
Gothburz
la source