วิธีเปลี่ยนชนิดข้อมูลเป็นสตริงใน python


140

ฉันจะเปลี่ยนประเภทข้อมูลเป็นสตริงใน Python ได้อย่างไร


10
str(var)เหรอ? นั่นคือสิ่งที่คุณกำลังมองหา?
SilentGhost

2
คุณต้องการแสดงข้อมูลสตริงที่มนุษย์อ่านได้หรือไม่? หรือคุณต้องการมุมมองที่เน้นไบต์ของหน่วยความจำที่มีข้อมูล?
Jeremy Brown

ระวังประเภทของข้อมูลที่คุณต้องการเปลี่ยนแปลง ดูคำตอบด้านล่าง
PythoNic

ทุกคลาส / ประเภทใน python อนุญาตให้strเรียกใช้โดยไม่มีข้อผิดพลาดหรือไม่?
Charlie Parker

คำตอบ:


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

นอกจากนี้หรือลอง repr:

mystring = repr(myvariable) # '4'

สิ่งนี้เรียกว่า "การแปลง" ใน python และเป็นเรื่องธรรมดา


6
ฉันจะไม่ใช้ repr (myvariable) - มันมักจะส่งคืนข้อมูลเกี่ยวกับประเภทคลาสที่อยู่หน่วยความจำเป็นต้นซึ่งมีประโยชน์มากกว่าสำหรับการดีบัก ใช้ str (myvariable) สำหรับการแปลงเป็นสตริงและยูนิโคด (ตัวแปร) สำหรับการแปลงเป็นยูนิโค้ด
Abgan

3
แล้ว Unicode ล่ะ? สิ่งที่ชอบstr(u'ä')จะไม่ทำงาน อย่างไรก็ตามrepr(u'ä')จะได้ผล
Rouven B.

1
แล้ว None และ False ล่ะ?
fredless

ทุกคลาส / ประเภทใน python อนุญาตให้strเรียกใช้โดยไม่มีข้อผิดพลาดหรือไม่?
Charlie Parker

57

strมีขึ้นเพื่อสร้างการแสดงสตริงของข้อมูลของวัตถุ หากคุณกำลังเขียนชั้นเรียนของตัวเองและต้องการstrทำงานให้คุณเพิ่ม:

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

print str(myObj)จะโทรmyObj.__str__().

reprเป็นวิธีการที่คล้ายกันซึ่งโดยทั่วไปจะให้ข้อมูลเกี่ยวกับข้อมูลชั้นเรียน สำหรับอ็อบเจ็กต์ไลบรารีหลักส่วนใหญ่reprสร้างชื่อคลาส (และบางครั้งข้อมูลคลาส) ระหว่างวงเล็บมุม reprจะถูกนำมาใช้ตัวอย่างเช่นเพียงแค่พิมพ์วัตถุของคุณลงในบานหน้าต่างการโต้ตอบโดยไม่ต้องใช้printหรือสิ่งอื่นใด

คุณสามารถกำหนดพฤติกรรมของreprวัตถุของคุณเองได้เช่นเดียวกับที่คุณกำหนดพฤติกรรมของstr:

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

>>> myObjในบานหน้าต่างการโต้ตอบของคุณหรือrepr(myObj)จะส่งผลให้myObj.__repr__()


อาจเป็นความจริงที่ว่าอ็อบเจ็กต์ไลบรารีหลักส่วนใหญ่ตามเปอร์เซ็นต์ดิบจะคืนค่าobject.__repr__-style angle-bracket แทน แต่ส่วนใหญ่ที่ใช้กันทั่วไปไม่ กฎของหัวแม่มือสำหรับreprคือว่าถ้ามันทำให้ความรู้สึกที่จะส่งคืนรหัสหลามที่อาจได้รับการประเมินในการผลิตวัตถุเดียวกันทำอย่างนั้นเหมือนstr, frozensetและส่วนใหญ่ builtins อื่น ๆ ทำ แต่ถ้ามันไม่ได้ใช้มุมวงเล็บ แบบฟอร์มเพื่อให้แน่ใจว่าสิ่งที่คุณส่งกลับมาไม่อาจถูกเข้าใจผิดว่าเป็นตัวแทนที่อ่านได้และประเมินได้ในฐานะแหล่งที่มา
abarnert

(แน่นอนว่าบิวน์อินบางตัวละเมิดกฎทั่วไปlistนั่นคือตัวมันเองจะส่งคืนสิ่งที่ไม่เพียง แต่ดูเหมือน แต่เป็นโค้ดที่ประเมินได้ซึ่งประเมินว่าผิด - แต่ผู้พัฒนาหลักไม่เคยถือเอาสิ่งนั้นมาเป็นใบอนุญาตในการขยายสิ่งเดียวกัน พฤติกรรมใน stdlib)
ยกเลิก

ทุกคลาส / ประเภทใน python อนุญาตให้strเรียกใช้โดยไม่มีข้อผิดพลาดหรือไม่?
Charlie Parker

@CharlieParker ใช่; __str__เป็นฟังก์ชันที่สืบทอดมาจากคลาสอ็อบเจ็กต์ซึ่งเป็นรูทสำหรับคลาสอื่น ๆ ทั้งหมดใน Python docs.python.org/3/reference/datamodel.html#object.__str__
Brian S

19

str(object)ผมเห็นคำตอบทั้งหมดขอแนะนำให้ใช้ อาจล้มเหลวหากวัตถุของคุณมีอักขระ ascii มากกว่าและคุณจะเห็นข้อผิดพลาดเช่นordinal not in range(128). นี่เป็นกรณีของฉันในขณะที่ฉันกำลังแปลงรายการสตริงเป็นภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ

ฉันแก้ไขโดยใช้ unicode(object)


7
ใน Python 3.0 เป็นต้นไป str (object) จะทำ unicode ตามค่าเริ่มต้น
dmjalund

ทุกคลาส / ประเภทใน python อนุญาตให้strเรียกใช้โดยไม่มีข้อผิดพลาดหรือไม่?
Charlie Parker

13

str(object) จะทำเคล็ดลับ

หากคุณต้องการเปลี่ยนวิธีที่อ็อบเจ็กต์ถูกกำหนดให้กำหนด__str__(self)วิธีการสำหรับคลาสของอ็อบเจ็กต์ วิธีการดังกล่าวต้องส่งคืนวัตถุ str หรือ unicode


วิธีใดมีประสิทธิภาพ str(any_var)หรือany_var.__str__()
Kedar.Aitawdekar

@ Kedar Aitawdekar: แม้ว่าเวลาในการดำเนินการจะแตกต่างกันอย่างเห็นได้ชัด (ซึ่งฉันสงสัย แต่ฉันขอแนะนำให้คุณตรวจสอบโดยใช้timeitโมดูล) คุณควรใช้str(any_var)เนื่องจากสามารถอ่านได้มากขึ้นสำหรับมนุษย์และอนุญาตให้ได้รับประโยชน์จากกรณีต่างๆเมื่อany_varกำหนด__repr__()แต่ไม่ ' __str__()ทีกำหนด
Abgan

ขอบคุณสำหรับการตอบกลับของคุณ.
Kedar Aitawdekar

ทุกคลาส / ประเภทใน python อนุญาตให้strเรียกใช้โดยไม่มีข้อผิดพลาดหรือไม่?
Charlie Parker

12

ใช้ในstrตัว:

x = str(something)

ตัวอย่าง:

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

...

จากเอกสารประกอบ:

ส่งคืนสตริงที่มีการแสดงวัตถุที่พิมพ์ได้อย่างสวยงาม สำหรับสตริงจะคืนค่าสตริงเอง ความแตกต่างกับ repr (object) คือ str (object) ไม่พยายามส่งคืนสตริงที่เป็นที่ยอมรับสำหรับ eval (); เป้าหมายคือการส่งคืนสตริงที่พิมพ์ได้ หากไม่ได้ระบุอาร์กิวเมนต์ให้ส่งกลับสตริงว่าง ''


ทุกคลาส / ประเภทใน python อนุญาตให้strเรียกใช้โดยไม่มีข้อผิดพลาดหรือไม่?
Charlie Parker

5

ด้วยstr(x). อย่างไรก็ตามข้อมูลทุกประเภทสามารถกำหนดการแปลงสตริงของตัวเองได้ดังนั้นนี่อาจไม่ใช่สิ่งที่คุณต้องการ


3
นี่เป็นข้อพิจารณาที่สำคัญ แต่หายาก ดีที่คุณพูดถึงมัน
jathanism



0

ใช้การจัดรูปแบบ:

"%s" % (x)

ตัวอย่าง:

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

เอาท์พุท: พฤหัสบดี 11 ม.ค. 20:40:05 น. 2018


0

โปรดใช้ความระมัดระวังหากคุณต้องการ "เปลี่ยน" ประเภทข้อมูลจริงๆ เช่นเดียวกับในกรณีอื่น ๆ (เช่นการเปลี่ยนตัววนซ้ำในการforวนซ้ำ) สิ่งนี้อาจทำให้เกิดพฤติกรรมที่ไม่คาดคิด:

>> dct = {1:3, 2:1}
>> len(str(dct))
12
>> print(str(dct))
{1: 31, 2: 0}
>> l = ["all","colours"]
>> len(str(l))
18
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.