comment changer n'importe quel type de données en une chaîne en python

135

Comment puis-je changer n'importe quel type de données en une chaîne en Python?

duhhunjonn
la source
10
str(var)? c'est ça que tu cherches?
SilentGhost
2
Voulez-vous une représentation sous forme de chaîne lisible par l'homme des données? Ou voulez-vous une vue orientée octets de la mémoire contenant les données?
Jeremy Brown
Soyez prudent avec le type de données que vous souhaitez modifier. Voir la réponse ci
PythoNic

Réponses:

126
myvariable = 4
mystring = str(myvariable)  # '4'

aussi, essayez également repr:

mystring = repr(myvariable) # '4'

C'est ce qu'on appelle la «conversion» en python, et c'est assez courant.

Donald Miner
la source
6
Je n'utiliserais pas repr (myvariable) - il renvoie souvent des informations sur le type de classe, l'adresse mémoire, etc. C'est plus utile pour le débogage. Utilisez str (myvariable) pour la conversion en chaîne et unicode (variable) pour la conversion en unicode.
Abgan
2
Qu'en est-il de l'Unicode? Quelque chose comme ça str(u'ä')ne fonctionnera pas. Cependant repr(u'ä')fonctionnera.
Rouven B.
1
qu'en est-il de Aucun et Faux?
fredless
54

strest destiné à produire une représentation sous forme de chaîne des données de l'objet. Si vous écrivez votre propre cours et que vous souhaitez strtravailler pour vous, ajoutez:

def __str__(self):
    return "Some descriptive string"

print str(myObj)appellera myObj.__str__().

represt une méthode similaire, qui produit généralement des informations sur les informations de classe. Pour la plupart des objets de bibliothèque de base, reprproduit le nom de la classe (et parfois certaines informations de classe) entre crochets angulaires. reprsera utilisé, par exemple, en tapant simplement votre objet dans votre volet d'interactions, sans utiliser printni rien d'autre.

Vous pouvez définir le comportement de reprpour vos propres objets tout comme vous pouvez définir le comportement de str:

def __repr__(self):
    return "Some descriptive string"

>>> myObjdans votre volet d'interactions, ou repr(myObj)entraîneramyObj.__repr__()

Brian S
la source
Il est probablement vrai que la majorité des objets de bibliothèque de base par pourcentage brut renvoient la object.__repr__représentation de type crochet angulaire, mais la plupart des objets les plus couramment utilisés ne le font pas. La règle de base pour reprque s'il est logique de retourner le code Python qui pourrait être évaluée pour produire le même objet, faire, tout comme str, frozensetet la plupart des autres builtins font, mais si elle ne le fait pas, utilisez l'angle-support formulaire pour vous assurer que ce que vous retournez ne peut pas être confondu avec une représentation lisible par l'homme et évaluable en tant que source.
abarnert
(Bien sûr, certains des composants intégrés enfreignent cette règle de base - un listqui inclut lui-même renvoie quelque chose qui non seulement ressemble mais est du code évaluable, qui évalue la mauvaise chose - mais les développeurs principaux n'ont jamais pris cela comme une licence pour développer le même comportement dans le stdlib.)
abarnert
19

Je vois que toutes les réponses recommandent d'utiliser str(object). Cela peut échouer si votre objet a plus de caractères ascii et vous verrez une erreur comme ordinal not in range(128). C'était le cas pour moi pendant que je convertissais une liste de chaînes dans une langue autre que l'anglais

Je l'ai résolu en utilisant unicode(object)

Madhav
la source
7
dans Python 3.0 et au-delà, str (object) fait unicode par défaut
dmjalund
13

str(object) fera l'affaire.

Si vous souhaitez modifier la manière dont l'objet est stringifié, définissez la __str__(self)méthode de la classe de l'objet. Une telle méthode doit retourner un objet str ou unicode.

Abgan
la source
Quelle méthode est efficace? str(any_var)ouany_var.__str__()
Kedar.Aitawdekar
@ Kedar.Aitawdekar: Même s'il y a une différence notable dans le temps d'exécution (ce dont je doute, mais je vous encourage à le vérifier en utilisant le timeitmodule), vous devriez l'utiliser str(any_var)car il est plus lisible pour l'homme et permet de bénéficier de cas où any_vardéfinit __repr__()mais ne le fait pas ' t définir __str__().
Abgan
Merci pour votre réponse.
Kedar.Aitawdekar
12

Utilisez le strintégré:

x = str(something)

Exemples:

>>> str(1)
'1'
>>> str(1.0)
'1.0'
>>> str([])
'[]'
>>> str({})
'{}'

...

De la documentation:

Renvoie une chaîne contenant une représentation joliment imprimable d'un objet. Pour les chaînes, cela renvoie la chaîne elle-même. La différence avec repr (object) est que str (object) n'essaie pas toujours de renvoyer une chaîne acceptable pour eval (); son objectif est de renvoyer une chaîne imprimable. Si aucun argument n'est donné, renvoie la chaîne vide, «».

Miku
la source
5

Avec str(x). Cependant, chaque type de données peut définir sa propre conversion de chaîne, donc ce n'est peut-être pas ce que vous souhaitez.

Philipp
la source
3
C'est une considération importante mais rare. C'est bien que vous en ayez parlé.
jathanism
3

Vous pouvez utiliser %scomme ci-dessous

>>> "%s" %([])
'[]'
SuperNova
la source
1

Utilisez simplement str- par exemple:

>>> str([])
'[]'
Justin Ethier
la source
0

Utilisez la mise en forme:

"%s" % (x)

Exemple:

x = time.ctime(); str = "%s" % (x); print str

Sortie: jeu 11 janvier 20:40:05 2018

Apostolos
la source
0

Soyez prudent si vous voulez vraiment "changer" le type de données. Comme dans d'autres cas (par exemple, changer l'itérateur dans une forboucle), cela peut provoquer un comportement inattendu:

>> dct = {1:3, 2:1}
>> len(str(dct))
12
>> print(str(dct))
{1: 31, 2: 0}
>> l = ["all","colours"]
>> len(str(l))
18
PythoNic
la source