Làm thế nào để thay đổi bất kỳ loại dữ liệu thành một chuỗi trong python


135

Làm cách nào tôi có thể thay đổi bất kỳ loại dữ liệu nào thành một chuỗi trong Python?


10
str(var)? đó là những gì bạn đang tìm kiếm?
SilentGhost

2
Bạn có muốn một đại diện chuỗi có thể đọc được của con người của dữ liệu? Hay bạn muốn có một khung nhìn theo định hướng byte của bộ nhớ chứa dữ liệu?
Jeremy Brown

Hãy cẩn thận với loại dữ liệu bạn muốn thay đổi. Xem câu trả lời dưới đây
PythoNic

Câu trả lời:


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

Ngoài ra, hãy thử repr:

mystring = repr(myvariable) # '4'

Điều này được gọi là "chuyển đổi" trong python, và khá phổ biến.


6
Tôi sẽ không sử dụng repr (myvariable) - nó thường trả về thông tin về loại lớp, địa chỉ bộ nhớ, vv Nó hữu ích hơn cho việc gỡ lỗi. Sử dụng str (myvariable) để chuyển đổi thành chuỗi và unicode (biến) để chuyển đổi sang unicode.
Abgan

2
Còn unicode thì sao? Một cái gì đó như str(u'ä')sẽ không hoạt động. Tuy nhiên repr(u'ä')sẽ làm việc.
Rouven B.

1
Không có gì và sai?
fredless

54

strcó nghĩa là để tạo ra một chuỗi đại diện cho dữ liệu của đối tượng. Nếu bạn đang viết lớp của riêng bạn và bạn muốn strlàm việc cho bạn, hãy thêm:

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

print str(myObj)sẽ gọi myObj.__str__().

reprlà một phương thức tương tự, thường tạo ra thông tin về thông tin lớp. Đối với hầu hết các đối tượng thư viện lõi, reprtạo tên lớp (và đôi khi một số thông tin lớp) giữa các dấu ngoặc góc. reprsẽ được sử dụng, ví dụ, chỉ bằng cách nhập đối tượng của bạn vào khung tương tác của bạn, mà không sử dụng printhoặc bất cứ điều gì khác.

Bạn có thể xác định hành vi reprcho các đối tượng của riêng mình giống như bạn có thể xác định hành vi của str:

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

>>> myObjtrong khung tương tác của bạn, hoặc repr(myObj), sẽ dẫn đếnmyObj.__repr__()


Có lẽ đúng là phần lớn các đối tượng thư viện lõi theo tỷ lệ phần trăm thô trả về object.__repr__biểu diễn khung góc kiểu, nhưng nhiều đối tượng được sử dụng phổ biến nhất thì không. Nguyên tắc hàng đầu cho reprlà nếu nó làm cho tinh thần để trở lại mã Python có thể được đánh giá để sản xuất cùng một đối tượng, làm được điều đó, giống như str, frozenset, và hầu hết các lệnh nội trú khác làm, nhưng nếu không, sử dụng các góc khung hình thức để đảm bảo rằng những gì bạn trả lại có thể không bị nhầm lẫn với một repr nguồn có thể đọc và đánh giá được như con người.
abarnert

(Tất nhiên một số nội dung vi phạm quy tắc ngón tay cái listđó bao gồm chính nó trả về một thứ gì đó không chỉ trông giống mà còn là mã có thể đánh giá được, đánh giá sai điều đó nhưng các nhà phát triển cốt lõi chưa bao giờ coi đó là giấy phép để mở rộng giống nhau hành vi vào stdlib.)
abarnert

19

Tôi thấy tất cả các câu trả lời đề nghị sử dụng str(object). Nó có thể thất bại nếu đối tượng của bạn có nhiều ký tự ascii và bạn sẽ thấy lỗi như thế nào ordinal not in range(128). Đây là trường hợp của tôi khi tôi đang chuyển đổi danh sách chuỗi bằng ngôn ngữ khác tiếng Anh

Tôi đã giải quyết nó bằng cách sử dụng unicode(object)


7
trong Python 3.0 trở đi, str (object) không unicode theo mặc định
dmjalund

13

str(object) sẽ thực hiện các mẹo.

Nếu bạn muốn thay đổi cách đối tượng được xâu chuỗi, hãy định nghĩa __str__(self)phương thức cho lớp của đối tượng. Phương thức này phải trả về đối tượng str hoặc unicode.


Phương pháp nào hiệu quả? str(any_var)hoặcany_var.__str__()
Kedar.Aitawdekar

@ Kedar.Aitawdekar: Ngay cả khi có sự khác biệt đáng chú ý về thời gian thực hiện (mà tôi nghi ngờ, nhưng tôi khuyến khích bạn nên sử dụng timeitmô-đun), bạn nên sử dụng str(any_var)vì nó dễ đọc hơn cho con người và cho phép hưởng lợi từ các trường hợp khi any_varxác định __repr__()nhưng không ' t xác định __str__().
Abgan

Cảm ơn vì đã trả lời.
Kedar.Aitawdekar

12

Sử dụng tích strhợp:

x = str(something)

Ví dụ:

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

...

Từ tài liệu:

Trả về một chuỗi chứa một đại diện có thể in độc đáo của một đối tượng. Đối với chuỗi, điều này trả về chính chuỗi. Sự khác biệt với repr (object) là str (object) không phải lúc nào cũng cố gắng trả về một chuỗi có thể chấp nhận được với eval (); Mục tiêu của nó là trả về một chuỗi có thể in được. Nếu không có đối số nào được đưa ra, trả về chuỗi trống, ''.


5

Với str(x). Tuy nhiên, mọi loại dữ liệu có thể xác định chuyển đổi chuỗi riêng của nó, vì vậy đây có thể không phải là điều bạn muốn.


3
Đây là một xem xét quan trọng nhưng hiếm. Thật tốt khi bạn đề cập đến nó.
jathanism



0

Sử dụng định dạng:

"%s" % (x)

Thí dụ:

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

Đầu ra: Thu ngày 11 tháng 1 20:40:05 2018


0

Hãy cẩn thận nếu bạn thực sự muốn "thay đổi" kiểu dữ liệu. Giống như trong các trường hợp khác (ví dụ: thay đổi iterator trong một forvòng lặp), điều này có thể mang đến hành vi không mong muốn:

>> dct = {1:3, 2:1}
>> len(str(dct))
12
>> print(str(dct))
{1: 31, 2: 0}
>> l = ["all","colours"]
>> len(str(l))
18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.