jak zmienić dowolny typ danych na łańcuch w Pythonie

135

Jak mogę zmienić dowolny typ danych na ciąg znaków w Pythonie?

duhhunjonn
źródło
10
str(var)? czy tego szukasz?
SilentGhost
2
Czy chcesz, aby dane były czytelne dla człowieka? A może chcesz mieć zorientowany na bajty widok pamięci zawierającej dane?
Jeremy Brown
Uważaj na typ danych, które chcesz zmienić. Zobacz odpowiedź poniżej
PythoNic

Odpowiedzi:

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

również alternatywnie spróbuj repr:

mystring = repr(myvariable) # '4'

Nazywa się to „konwersją” w Pythonie i jest dość powszechne.

Donald Miner
źródło
6
Nie użyłbym repr (myvariable) - często zwraca informacje o typie klasy, adresie pamięci itp. Jest bardziej przydatne do debugowania. Użyj str (myvariable) do konwersji na łańcuch i unicode (zmienna) do konwersji na Unicode.
Abgan,
2
A co z Unicode? Coś takiego str(u'ä')nie zadziała. Jednak repr(u'ä')zadziała.
Rouven B.
1
a co z brakiem i fałszem?
fredless
54

strma na celu utworzenie łańcucha reprezentującego dane obiektu. Jeśli piszesz własną klasę i chcesz strpracować dla siebie, dodaj:

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

print str(myObj)zadzwoni myObj.__str__().

reprjest podobną metodą, która generalnie generuje informacje o klasie. W przypadku większości podstawowych obiektów bibliotecznych reprtworzy nazwę klasy (i czasami informacje o klasie) w nawiasach ostrych. reprzostanie użyty, na przykład, po prostu wpisując obiekt w panelu interakcji, bez użycia printlub czegokolwiek innego.

Możesz zdefiniować zachowanie reprwłasnych obiektów, tak jak możesz zdefiniować zachowanie str:

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

>>> myObjw panelu interakcji lub repr(myObj)spowodujemyObj.__repr__()

Brian S.
źródło
Prawdopodobnie prawdą jest, że większość podstawowych obiektów biblioteki według surowego procentu zwraca reprezentację w object.__repr__stylu nawiasów ostrych, ale wiele z najczęściej używanych nie. Ogólna reguła reprjest taka, że ​​jeśli ma sens zwracanie kodu Pythona, który można by ocenić w celu wytworzenia tego samego obiektu, zrób to tak samo str, jak frozensetwiększość innych poleceń wbudowanych, ale jeśli nie, użyj nawiasu kątowego formularz, aby upewnić się, że to, co zwracasz, nie może zostać pomylone z plikiem źródłowym czytelnym dla człowieka i możliwym do oceny.
abarnert
(Oczywiście niektóre wbudowane funkcje naruszają tę praktyczną zasadę - listktóra zawiera samą siebie zwraca coś, co nie tylko wygląda, ale jest kodem możliwym do oceny, co ocenia nieprawidłowo - ale rdzenni deweloperzy nigdy nie traktowali tego jako licencji na rozszerzenie tego samego zachowanie do standardowej biblioteki.)
abarnert
19

Widzę, że wszystkie odpowiedzi zalecają użycie str(object). Może się nie powieść, jeśli twój obiekt ma więcej znaków niż ASCII i zobaczysz błąd podobny do ordinal not in range(128). Tak było w przypadku mnie, gdy konwertowałem listę ciągów w języku innym niż angielski

Rozwiązałem to za pomocą unicode(object)

Madhav
źródło
7
w Pythonie 3.0 i nowszych, str (obiekt) domyślnie wykonuje unicode
dmjalund
13

str(object) da rade.

Jeśli chcesz zmienić sposób, w jaki obiekt jest określany jako łańcuch, zdefiniuj __str__(self)metodę dla klasy obiektu. Taka metoda musi zwrócić obiekt str lub unicode.

Abgan
źródło
Która metoda jest skuteczna? str(any_var)lubany_var.__str__()
Kedar.Aitawdekar
@ Kedar.Aitawdekar: Nawet jeśli istnieje zauważalna różnica w czasie wykonania (w co wątpię, ale zachęcam do sprawdzenia go za pomocą timeitmodułu), powinieneś użyć, str(any_var)ponieważ jest bardziej czytelny dla ludzi i pozwala korzystać z przypadków, gdy any_vardefiniuje, __repr__()ale nie robi t zdefiniować __str__().
Abgan,
Dzięki za odpowiedź.
Kedar.Aitawdekar
12

Użyj strwbudowanego:

x = str(something)

Przykłady:

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

...

Z dokumentacji:

Zwraca łańcuch zawierający ładną, drukowalną reprezentację obiektu. W przypadku ciągów zwraca sam ciąg. Różnica z repr (obiekt) polega na tym, że str (obiekt) nie zawsze próbuje zwrócić łańcuch, który jest akceptowany przez eval (); jego celem jest zwrócenie drukowalnego ciągu. Jeśli nie podano argumentu, zwraca pusty ciąg, „”.

miku
źródło
5

Z str(x). Jednak każdy typ danych może definiować własną konwersję ciągów, więc może to nie być to, czego chcesz.

Philipp
źródło
3
Jest to ważna, ale rzadka kwestia. Dobrze, że o tym wspomniałeś.
jathanizm
3

Możesz użyć %sjak poniżej

>>> "%s" %([])
'[]'
SuperNova
źródło
1

Po prostu użyj str- na przykład:

>>> str([])
'[]'
Justin Ethier
źródło
0

Użyj formatowania:

"%s" % (x)

Przykład:

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

Wyjście: czw. 11 stycznia 2018 r. 20:40:05

Apostolos
źródło
0

Uważaj, jeśli naprawdę chcesz „zmienić” typ danych. Podobnie jak w innych przypadkach (np. Zmiana iteratora w forpętli) może to spowodować nieoczekiwane zachowanie:

>> dct = {1:3, 2:1}
>> len(str(dct))
12
>> print(str(dct))
{1: 31, 2: 0}
>> l = ["all","colours"]
>> len(str(l))
18
PythoNic
źródło