Hướng dẫn dùng string formatting python

Hướng dẫn cách định dạng chuỗi trong python bằng phương thức format(). Đây là phương thức được tích hợp từ Python 2.6, nhằm giúp việc định dạng chuỗi trong python đơn giản và trực quan hơn.

Bạn cũng có thể tham khảo các cách định dạng chuỗi trong python khác như dưới đây:

  • Định dạng chuỗi trong python bằng toán tử %
  • Định dạng chuỗi trong python bằng chuỗi f

Định dạng chuỗi trong python bằng phương thức format

Để định dạng chuỗi trong python, chúng ta sử dụng phương thức format với cú pháp sau đây:

pattern. format ( value1 , value2 , value3 , …)

Trong đó pattern là định dạng chuỗi chứa các trường thay thế (field) . Các đối số value của phương thức format() là các giá trị thay thế sẽ được dùng để thay thế các trường thay thế có trong pattern.

Trong ví dụ dưới đây, "{} {} {} {}""{} is {} years old" được gọi là các định dạng chuỗi pattern và các cặp {} được gọi là các trường thay thế có trong định dạng chuỗi đó:

str_format = "{} {} {} {}".format('Kiyoshi','is','30','years old ')
print(str_format)


str_format = "{} is {} years old".format('Kiyoshi','30')
print(str_format)

Để định dạng chuỗi trong python bằng phương thức format, bạn cần nắm vững trường thay thế là gì cũng như cách định dạng chuỗi trong python thông qua định dạng trường thay thế sẽ được hướng dẫn chi tiết sau đây.

Khái niệm trường thay thế trong định dạng chuỗi python

Trong một định dạng chuỗi sẽ có những phần bất biến và những phần có thể thay đổi giá trị.

Chúng ta đặt các phần có thể thay đổi giá trị giữa cặp dấu {} và gọi chúng là trường thay thế trong python.

Các trường thay thế nhận giá trị thay thế, sau đó định dạng giá trị thay thế theo dạng chỉ định, trước khi trả kết quả vào chuỗi.

Ví dụ:

str_format = "{} is {:03d} years old".format('Kiyoshi',30)
print(str_format)

Ở ví dụ trên, định dạng chuỗi "{} is {:03d} years old" có phần bất biến là các ký tự isyears old. Hai ký tự còn lại là phần có thể thay đổi giá trị được biểu diễn bởi hai trường thay thế là {}{:03d} .

Các trường thay thế nhận các giá trị từ đối số của hàm format(), sau đó định dạng chúng theo dạng chỉ định và trả kết quả về chuỗi. Ví dụ trường thay thế {:03d} có dạng một số có 3 chữ số đã biến giá trị 30 thành 030 trong kết quả như sau:

Kiyoshi is 030 years old

Khi chỉ định giá trị thay thế trong đối số của phương thức format(), ngoài cách chỉ định trực tiếp giá trị như trên, chúng ta cũng có thể chỉ định giá trị thay thế thông qua biểu thức tính toán như ví dụ sau đây:

x = 1
y = 100
result = 'x + y = {}'.format(x + y)
print(result)

Giá trị của biểu thức tính tổng trong đối số của phương thức format() sẽ được thay thế vào trường thay thế, và in ra màn hình kết quả như sau:

x + y = 101

Phân biệt các trường thay thế khi định dạng chuỗi trong python bằng phương thức format

Trong một chuỗi định dạng chứa nhiều trường thay thế, để phân biệt chúng, chúng ta cần gán số thứ tự hoặc là keyword cho chúng bên trong cặp dấu {}.
Và nếu sử dụng số, chúng ta cần dùng các số nguyên lớn hơn hoặc bằng 0 liên tiếp như0,1,2,3,4....

Ví dụ, chúng ta phân biệt các trường thay thế trong chuỗi định dạng bằng số thứ tự như sau:

"name:{0} , old:{1}, address:{2}"

Chúng ta cần lấy các số liên tiếp để gán cho trường thay thế, ví dụ chúng ta không thể nhảy cóc và lấy các số như 0,2,3,5,..

Tuy nhiên chúng ta không nhất thiết phải gán đúng thứ tự tăng dần các số này cho trường thay thế, ví dụ cách gán dưới đây cũng OK.

"name:{1} , old:{0}, address:{2}"

Cần lưu ý là thứ tự trong trường thay thế có thể bị xáo trộn, nhưng thứ tự cảu các giá trị thay thế trong đối số của phương thức format() lại được mặc định tính theo đúng thứ tự tăng dần từ trái qua phải.
Giá trị này sẽ được thay thế đúng với trường thay thế có số thứ tự tương ứng với nó, nên kể cả chúng ta thay đổi vị trí của trường giá trị, thì giá trị gán vào nó cũng sẽ không thay đổi.

print( "name:{0} , old:{1}, address:{2}".format('Kiyoshi','30','tokyo'))


print( "address:{2} , name:{0} , old:{1}".format('Kiyoshi','30','tokyo'))

Trong trường hợp thứ tự của các trường thay thế giống với giá trị thay thế chúng, hãy lược bỏ số thứ tự của chúng như sau:

print( "name:{} , old:{}, address:{}".format('Kiyoshi','30','tokyo'))

Ngoài cách sử dụng số thứ tự để phân biệt trường thay thế, bạn cũng có thể sử dụng keyword để phân biết chúng như sau:

"name:{n} , old:{o}, address:{ad}"

Sau đó, chúng ta cũng cần chỉ định thêm keyword vào các giá trị gán trong đối số của phơng thức format là xong:

str="name:{n} , old:{o}, address:{ad}".format(n="Kiyoshi",o=30,ad="Japan")
print(str)


Cách định dạng các trường thay thế trong phương thức format

Ở các ví dụ trên, chúng ta đã tìm hiểu cách định dạng chuỗi bằng trường thay thế đơn giản nhất là dạng cặp dấu {} hoặc là thêm số, keyword vào giữa cặp dấu đó.

Trong phần này, chúng ta sẽ tìm hiểu thêm các cách định dạng chuỗi trong python linh hoạt hơn thông qua tùy chỉnh định dạng các trường thay thế này.

Ví dụ, chúng ta định dạng chuỗi có 8 ký tự bằng cách dùng trường thay thế có định dạng {:8s} hoặc {0:8s} hoặc {name:8s} như sau:

str1= "Name:[{:8s}], old:{:4d}".format("Ya", 18)
str2= "Name:[{0:8s}], old:{1:4d}".format("Yama", 18)
str3= "Name:[{name:8s}], old:{old:4d}".format(name="Yamad", old=18)

print(str1)
print(str2)
print(str3)

Kết quả:

Name: [Ya      ], old:  18
Name: [Yama ], old: 18
Name: [Yamad ], old: 18

Các tùy chọn định dạng phổ biến của trường thay thế như sau:

Định dạng chuỗi với kiểu giá trị trong chuỗi | type()

Chúng ta có thể định dạng kiểu giá trị sử dụng trong chuỗi bằng cú pháp sau đây:

{:type}

Trong đó typle là ký hiệu biểu diễn kiểu giá trị sử dụng. Các kiểu giá trị này có thể là kiểu chuỗi, kiểu số nguyên, hoặc là kiểu số thực(float), và được biểu diễn với các ký hiệu trong bảng sau đây:

TypeĐịnh dạng kiểu dữ liệuVí dụ
s Kiểu chuỗi {:s}
b Kiểu số nhị phân {:b}
c Kiểu ký tự số {:c}
d Kiểu số thập phân {:d}
o Kiểu số bát pâhn {:0}
x Kiểu số thập lục phân {:x}
X Kiểu số thập lục phân {:X}
n Kiểu số nguyên {:n}
e Kiểu mũ {:e}
E Kiểu mũ {:E}
f Kiểu thập phân cố định {:f}
F Kiểu thập phân cố định {:F}
g Kiểu làm tròn số {:g}
G Kiểu làm tròn số {:G}
% Kiểu phần {:%}

Ví dụ chúng ta chỉ định kiểu dữ liệu của các giá trị thay thế là kiểu chuỗi như sau:

print("str1={:s}, str2={}".format("Lemon", "Apple"))

Hoặc là kiểu nhị phân hoặc thập lục phân:

print("str2={:b}, str3={:x}".format(20, 31))

Hoặc là kiểu mũ, thập phân cố định:

print("str2={:e}".format(0.0752))


print("str3={:f}".format(0.0752))

Hoặc biểu diễn số dưới dạng %:

print("str4={:%}".format(0.348))

Định dạng chuỗi trong python với độ dài chuỗi | width()

Chúng ta có thể định dạng số ký tự tối thiểu có trong chuỗi (độ dài tối thiểu của chuỗi) bằng cú pháp sau đây:

{:width}

Trong đó width là độ dài tối thiểu của chuỗi cần định dạng. Thông thường chúng ta định dạng độ dài tối thiểu của chuỗi kèm với định dạng kiểu giá trị, ví dụ {:10s} sẽ định dạng một chuỗi kiểu ký tự có tối thiểu 10 ký tự trong chuỗi. Hoặc {:5d} sẽ định dạng một chuỗi kiểu sổ có tối thiểu 5 ký tự trong đó.

print("str1 = [{:10s}]".format("Lemon"))


print("number = [{:5d}]".format(123))

Định dạng chuỗi trong python bằng cách căn lề chuỗi| fill & align

Chúng ta có thể định dạng chuỗi trong python bằng cách căn lề chuỗi với cú pháp sau đây:

{:align width}

Trong đó align là định dạng căn lề và width là độ dài tối thiểu của chuỗi cần định dạng. Chúng ta có thể sử dụng các định dạng căn lề từ trong bảng sau đây:

Ký hiệuĐịnh dạngVí dụ
< căn trái chuỗi {:<7d}
> căn phải chuỗi {:>7d}
^ căn giữa chuỗi {:^7d}
fill lấp chỗ trống {:0^7d}

Ví dụ, chúng ta định dạng chuỗi trong python với kiểu căn trái, căn phải và căn giữa chuỗi như sau:


print("số=[{:<7d}]".format(123))



print("số=[{:>7d}]".format(123))



print("số=[{:^7d}]".format(123))

Cần lưu ý là nếu chúng ta không chỉ định width thì định dạng căn lề algin không sử dụng được. Trong ví dụ sau, định dạng căn lề không hoạt động bởi chúng ta không chỉ định độ rộng tối thiểu của chuỗi:

print("số=[{:>7d}]".format(123))


print("số=[{:>d}]".format(123))

Sau đây, chúng ta sẽ xem xét về định dạng chuỗi với cách lấp chỗ trống trong chuỗi.
Về căn bản, các chỗ trống trong chuỗi được lấp đầy bởi ký tự trống ' '.

print("số=[{:7d}]".format(123))

Tuy nhiên chúng ta cũng có thể chỉ định ký tự ( số, chữ hoặc ký tự v.v..) thay cho ký tự trắng để dùng lấp chỗ, bằng cách sử dụng ký tự lấp chỗ kết hợp với ký tự căn lề, chẳng hạn như {:07d} trong ví dụ sau:

print("số=[{:07d}]".format(123))

Chúng ta cũng có thể sử dụng ký tự để lấp chỗ trống như ví dụ sau:

print("số={:*<7d}".format(123))


print("số={:-^7d}".format(123))

Lưu ý là nếu dùng ký tự để lấp chỗ trống, chúng ta cần sử dụng ký tự lấp chỗ trống fill kết hợp với ký tự căn lề align.
Nếu chỉ chỉ định fill và bỏ qua align thì định dạng lấp chỗ trống sẽ không hoạt động như ví dụ sau:

print("số=[{:-7d}]".format(123))


print("số=[{:-^7d}]".format(123))

  • Về cách căn lề trong python, bạn cũng có thể sử dụng các phương thức khác như ljust(), center() hoặc rjust(). Hãy tìm hiểu chi tiết tại bài viết Căn lề trong python.

Định dạng chuỗi trong python với dấu của số | sign( dấu )

Tiếp theo chúng ta sẽ tìm hiểu cách định dạng chuỗi trong python với dấu của số. Định dạng này chỉ sử dụng cho số, nhằm biểu thị dấu âm và dương của số như sau:

Ký hiệuĐịnh dạngVí dụ
+ Định dạng số dương (có thể sử dụng cho cả số âm) {:+d}
- Định dạng số âm ( chỉ sử dụng cho số âm) {:-d}
' ' Thêm khoảng trống vào số dương {: d}

Hãy cùng xem một số ví dụ sau đây:

print("số dương={:+d}, số âm={:+d}".format(72, -72))


print("số dương={:-d}, số âm={:-d}".format(72, -72))


print("số dương={: d}, số âm={: d}".format(72, -72))

Định dạng chuỗi trong python với dấu phân tách số | grouping_option

Tiếp theo chúng ta sẽ tìm hiểu về cách định dạng chuỗi trong python với dấu phân tách số. Định dạng này cho phép chúng ta tách và nhóm các số trong chuỗi lại bằng dấu chấm . ,dấu phẩy , hoặc dấu gạch dưới _ cho dễ phân biệt các hàng trong số đó.

Hãy cùng xem một số ví dụ sau đây:

print("số={:,d}".format(1234567))


print("số={:,f}".format(12345.6789))


print("số={:_d}".format(1234567))

Định dạng chuỗi trong python với độ chính xác của phần phân số | precision ()

Tiếp theo chúng ta sẽ tìm hiểu về định dạng chuỗi trong python với độ chính xác của phần phân số. Định dạng này chỉ sử dụng cho số, nhằm biểu diễn độ chính xác của phần phân số ( bằng số chữ số của phần phân số).
Mặc định độ chính xác này là 6 chữ số. Chúng ta có thể chỉ định độ chính xác này bằng cách viết số chữ số đằng sau dấu chấm . như sau:

print("số={:f}".format(1.2345))


print("số={:.1f}".format(1.2345))


print("số={:.3f}".format(1.2345))

Định dạng chuỗi trong python với cách biểu diễn khác nhau của số | #

Tiếp theo chúng ta sẽ tìm hiểu về định dạng chuỗi trong python với cách biểu diễn khác nhau của số. Định dạng này cho phép chúng ta chuyển cách biểu diễn của các số bát phân, thập phân sang các cách biểu diễn khác, ví dụ như thêm ký tự 0b,0o,0x vào đầu số:

print("số={:b}, số ở định dạng khác={:#b}".format(10, 10))


print("số={:o}, số ở định dạng khác={:#o}".format(20, 20))


print("số={:x}, số ở định dạng khác={:#x}".format(35, 35))

Tổng kết và thực hành

Trên đây Kiyoshi đã hướng dẫn bạn cách định dạng chuỗi trong python bằng phương thức format rồi. Bài này khá là dài, do đó bạn hãy chia nhỏ ra và học dần dần nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về python trong các bài học tiếp theo.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> python cơ bản - lập trình python cho người mới bắt đầu>>09. chuỗi trong python

Bài sau

Định dạng chuỗi trong python bằng toán tử định dạng

Bài tiếp

Định dạng chuỗi trong python bằng chuỗi f