So ändern Sie einen beliebigen Datentyp in eine Zeichenfolge in Python

135

Wie kann ich in Python einen beliebigen Datentyp in eine Zeichenfolge ändern?

duhhunjonn
quelle
10
str(var)? ist es das, wonach du suchst?
SilentGhost
2
Möchten Sie eine lesbare Zeichenfolgendarstellung der Daten? Oder möchten Sie eine byteorientierte Ansicht des Speichers, der die Daten enthält?
Jeremy Brown
Seien Sie vorsichtig mit der Art der Daten, die Sie ändern möchten. Siehe Antwort unten
PythoNic

Antworten:

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

Alternativ können Sie auch repr:

mystring = repr(myvariable) # '4'

Dies wird in Python als "Konvertierung" bezeichnet und ist weit verbreitet.

Donald Miner
quelle
6
Ich würde repr (myvariable) nicht verwenden - es gibt häufig Informationen über Klassentyp, Speicheradresse usw. zurück. Es ist nützlicher für das Debuggen. Verwenden Sie str (myvariable) für die Konvertierung in string und unicode (variable) für die Konvertierung in unicode.
Abgan
2
Was ist mit Unicode? So etwas str(u'ä')wird nicht funktionieren. Allerdings repr(u'ä')funktioniert.
Rouven B.
1
Was ist mit None und False?
Fredless
54

strsoll eine Zeichenfolgendarstellung der Objektdaten erzeugen. Wenn Sie Ihre eigene Klasse schreiben und für Sie arbeiten möchten str, fügen Sie hinzu:

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

print str(myObj)wird anrufen myObj.__str__().

reprist eine ähnliche Methode, die im Allgemeinen Informationen zu den Klasseninformationen erzeugt. reprErzeugt für die meisten Kernbibliotheksobjekte den Klassennamen (und manchmal einige Klasseninformationen) in spitzen Klammern. reprwird zum Beispiel verwendet, indem Sie Ihr Objekt einfach in Ihren Interaktionsbereich eingeben, ohne es zu verwenden printoder etwas anderes.

Sie können das Verhalten von reprfür Ihre eigenen Objekte genauso definieren wie das Verhalten von str:

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

>>> myObjin Ihrem Interaktionsbereich oder repr(myObj)wird dazu führenmyObj.__repr__()

Brian S.
quelle
Es ist wahrscheinlich richtig, dass die Mehrheit der object.__repr__Kernbibliotheksobjekte nach rohem Prozentsatz die Darstellung in spitzen Klammern zurückgibt, viele der am häufigsten verwendeten jedoch nicht. Als Faustregel für die reprist , dass , wenn es Sinn macht Python - Code zurückzugeben , die das gleiche Objekt ausgewertet werden konnten zu produzieren, das tun, wie gerade str, frozensetund die meisten anderen builtins tun, aber wenn dies nicht der Fall, verwenden Sie die Winkelhalterung Formular, um sicherzustellen, dass das, was Sie zurückgeben, möglicherweise nicht mit einem von Menschen lesbaren und als Quelle auswertbaren Repräsentanten verwechselt werden kann.
Abarnert
(Natürlich verstoßen einige der integrierten Funktionen gegen diese Faustregel - eine list, die sich selbst enthält, gibt etwas zurück, das nicht nur aussieht, sondern auch auswertbarer Code ist, der als falsch ausgewertet wird -, aber die Kernentwickler haben dies nie als Lizenz zur Erweiterung derselben angesehen Verhalten in die stdlib.)
abarnert
19

Ich sehe alle Antworten empfehlen zu verwenden str(object). Es kann fehlschlagen, wenn Ihr Objekt mehr als ASCII-Zeichen enthält und Sie Fehler wie sehen ordinal not in range(128). Dies war bei mir der Fall, als ich die Liste der Zeichenfolgen in eine andere Sprache als Englisch konvertierte

Ich habe es mit gelöst unicode(object)

Madhav
quelle
7
Ab
13

str(object) wird den Trick machen.

Wenn Sie die Art und Weise ändern möchten, wie das Objekt stringifiziert wird, definieren Sie die __str__(self)Methode für die Objektklasse. Eine solche Methode muss str oder Unicode-Objekt zurückgeben.

Abgan
quelle
Welche Methode ist effizient? str(any_var)oderany_var.__str__()
Kedar.Aitawdekar
@ Kedar.Aitawdekar: Auch wenn es einen merklichen Unterschied in der Ausführungszeit gibt (was ich bezweifle, aber ich empfehle Ihnen, es mit dem timeitModul zu überprüfen ), sollten Sie es verwenden, str(any_var)da es für den Menschen besser lesbar ist und es ermöglicht, von Fällen zu profitieren, wenn es any_vardefiniert ist, __repr__()aber nicht. t definieren __str__().
Abgan
Danke für deine Antwort.
Kedar.Aitawdekar
12

Verwenden Sie das streingebaute:

x = str(something)

Beispiele:

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

...

Aus der Dokumentation:

Gibt eine Zeichenfolge zurück, die eine gut druckbare Darstellung eines Objekts enthält. Bei Zeichenfolgen wird die Zeichenfolge selbst zurückgegeben. Der Unterschied zu repr (Objekt) besteht darin, dass str (Objekt) nicht immer versucht, eine Zeichenfolge zurückzugeben, die für eval () akzeptabel ist. Ziel ist es, eine druckbare Zeichenfolge zurückzugeben. Wenn kein Argument angegeben wird, wird die leere Zeichenfolge '' zurückgegeben.

miku
quelle
5

Mit str(x). Jeder Datentyp kann jedoch eine eigene Zeichenfolgenkonvertierung definieren, sodass dies möglicherweise nicht das ist, was Sie möchten.

Philipp
quelle
3
Dies ist eine wichtige, aber seltene Überlegung. Gut, dass du es erwähnt hast.
Nathanismus
3

Sie können %swie unten verwenden

>>> "%s" %([])
'[]'
SuperNova
quelle
1

Verwenden Sie einfach str- zum Beispiel:

>>> str([])
'[]'
Justin Ethier
quelle
0

Formatierung verwenden:

"%s" % (x)

Beispiel:

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

Ausgabe: Do 11. Januar 20:40:05 2018

Apostolos
quelle
0

Seien Sie vorsichtig, wenn Sie den Datentyp wirklich "ändern" möchten. Wie in anderen Fällen (z. B. Ändern des Iterators in einer forSchleife) kann dies zu unerwartetem Verhalten führen:

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