ฉันมีสตริงที่ดูเหมือน'%s in %s'
และต้องการทราบวิธีแยกอาร์กิวเมนต์เพื่อให้พวกเขาเป็นสอง% ที่แตกต่างกัน ใจของฉันมาจาก Java มากับสิ่งนี้:
'%s in %s' % unicode(self.author), unicode(self.publication)
แต่มันใช้ไม่ได้ผลมันดูเป็นงูใหญ่อย่างไร
ฉันมีสตริงที่ดูเหมือน'%s in %s'
และต้องการทราบวิธีแยกอาร์กิวเมนต์เพื่อให้พวกเขาเป็นสอง% ที่แตกต่างกัน ใจของฉันมาจาก Java มากับสิ่งนี้:
'%s in %s' % unicode(self.author), unicode(self.publication)
แต่มันใช้ไม่ได้ผลมันดูเป็นงูใหญ่อย่างไร
คำตอบ:
คำตอบของ Mark Cidade นั้นถูกต้องคุณต้องจัดหาสิ่งอันดับ
อย่างไรก็ตามจาก Python 2.6 เป็นต้นไปคุณสามารถใช้format
แทน%
:
'{0} in {1}'.format(unicode(self.author,'utf-8'), unicode(self.publication,'utf-8'))
ไม่สนับสนุนการใช้%
สำหรับสตริงการจัดรูปแบบอีกต่อไป
วิธีการจัดรูปแบบสตริงนี้เป็นมาตรฐานใหม่ใน Python 3.0 และควรใช้กับการจัดรูปแบบ% ที่อธิบายไว้ในการดำเนินการจัดรูปแบบสตริงในรหัสใหม่
หากคุณใช้อาร์กิวเมนต์มากกว่าหนึ่งอาร์กิวเมนต์ต้องอยู่ในรูปแบบของ tuple (โปรดสังเกตเครื่องหมายวงเล็บพิเศษ):
'%s in %s' % (unicode(self.author), unicode(self.publication))
เมื่อ EOL ชี้ให้เห็นunicode()
ฟังก์ชั่นมักจะถือว่าการเข้ารหัส ASCII เป็นค่าเริ่มต้นดังนั้นหากคุณมีอักขระที่ไม่ใช่ ASCII จะปลอดภัยกว่าที่จะผ่านการเข้ารหัสอย่างชัดเจน:
'%s in %s' % (unicode(self.author,'utf-8'), unicode(self.publication('utf-8')))
และตั้งแต่ Python 3.0 เราขอแนะนำให้ใช้str.format()
ไวยากรณ์แทน:
'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))
format
ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากเอกสาร:
ที่กำหนด
format % values
,%
ข้อกำหนดในการแปลงจะถูกแทนที่ด้วยศูนย์หรือมากกว่าองค์ประกอบของformat
values
เอฟเฟกต์นี้คล้ายคลึงกับการใช้งานsprintf()
ในภาษา Cหาก
format
ต้องการอาร์กิวเมนต์เดียวค่าอาจเป็นวัตถุที่ไม่ใช่ tuple เดียว มิฉะนั้นค่าต้อง tuple ตรงกับจำนวนรายการที่ระบุไว้โดยที่format
สตริง , หรือวัตถุที่ทำแผนที่เดียว (เช่นพจนานุกรม)
str.format
แทน%
ทางเลือกใหม่ที่จะดำเนินการคือการใช้%
str.format
นี่คือข้อความที่ตัดตอนมาจากเอกสาร:
str.format(*args, **kwargs)
ดำเนินการจัดรูปแบบสตริง
{}
สตริงกับวิธีการนี้เรียกว่าสามารถมีข้อความตัวอักษรหรือเปลี่ยนสาขาที่คั่นด้วยเครื่องหมายวงเล็บ แต่ละฟิลด์การแทนที่ประกอบด้วยดัชนีตัวเลขของอาร์กิวเมนต์ตำแหน่งหรือชื่อของอาร์กิวเมนต์คำหลัก ส่งคืนสำเนาของสตริงโดยที่แต่ละฟิลด์การแทนที่ถูกแทนที่ด้วยค่าสตริงของอาร์กิวเมนต์ที่สอดคล้องกันวิธีนี้เป็นมาตรฐานใหม่ในหลาม 3.0 และควรได้รับการแนะนำในการ
%
จัดรูปแบบ
นี่คือตัวอย่างการใช้งาน:
>>> '%s for %s' % ("tit", "tat")
tit for tat
>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles
>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond
>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond
'{self.author} in {self.publication}'.format(self=self)
ควร "ทำงาน" ฉันแค่ไม่แน่ใจเกี่ยวกับทั้งunicode
สิ่ง
{first[0]}
J
คุณต้องใส่ค่าลงในวงเล็บ:
'%s in %s' % (unicode(self.author), unicode(self.publication))
นี่เป็นครั้งแรกจะถูกวางไว้ และสำหรับวินาทีที่จะใช้%s
unicode(self.author)
%s
unicode(self.publication)
หมายเหตุ: คุณควรเห็นด้วย
string formatting
กับ%
สัญกรณ์ ข้อมูลเพิ่มเติมที่นี่
%s
ค่อนข้างformat
มีปัญหาสำคัญกับคำตอบบางส่วนที่โพสต์แล้ว: unicode()
ถอดรหัสจากการเข้ารหัสเริ่มต้นซึ่งมักจะเป็น ASCII; ในความเป็นจริงunicode()
พยายามที่จะทำให้ "ความรู้สึก" ของไบต์ที่ได้รับโดยการแปลงพวกเขาเป็นตัวละคร ดังนั้นรหัสต่อไปนี้ซึ่งเป็นสิ่งที่แนะนำโดยคำตอบก่อนหน้านี้ล้มเหลวในเครื่องของฉัน:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
ให้:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
ความล้มเหลวมาจากข้อเท็จจริงที่author
ไม่มีไบต์ ASCII เท่านั้น (เช่นมีค่าใน [0; 127]) และunicode()
ถอดรหัสจาก ASCII โดยค่าเริ่มต้น (บนเครื่องหลายเครื่อง)
โซลูชันที่แข็งแกร่งคือการให้การเข้ารหัสที่ใช้ในสาขาของคุณอย่างชัดเจน ใช้ UTF-8 เป็นตัวอย่าง:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(หรือไม่มีค่าเริ่มต้นu
ขึ้นอยู่กับว่าคุณต้องการผลลัพธ์ Unicode หรือสตริงไบต์)
ณ จุดนี้เราอาจต้องการพิจารณาให้มีauthor
และpublication
ฟิลด์เป็นสตริง Unicode แทนที่จะถอดรหัสระหว่างการจัดรูปแบบ
สำหรับ python2 คุณสามารถทำได้
'%(author)s in %(publication)s'%{'author':unicode(self.author),
'publication':unicode(self.publication)}
ซึ่งมีประโยชน์ถ้าคุณมีข้อโต้แย้งมากมายที่จะทดแทน (โดยเฉพาะถ้าคุณกำลังทำให้เป็นสากล)
Python2.6 เป็นต้นไปรองรับ .format()
'{author} in {publication}'.format(author=self.author,
publication=self.publication)
คุณสามารถใช้มันได้อย่างสะอาดและเรียบง่าย (แต่ผิด! เพราะคุณควรใช้format
เหมือนที่ Mark Byers พูด) โดยทำ:
print 'This is my %s formatted with %d arguments' % ('string', 2)
'{} in {}'
สตริงรูปแบบธรรมดา