DHDataHọc
TheoryLesson 8/305 min read+10 XP

Phương thức chuỗi

Bạn sẽ học được

  • Cắt khoảng trắng, tách và ghép chuỗi — ba thao tác làm sạch dữ liệu phổ biến nhất.
  • Tìm, thay thế, đổi hoa thường.
  • Kiểm tra tiền tố, hậu tố, loại ký tự.
  • Cắt chuỗi bằng chỉ số và slice.
  • Vì sao chuỗi bất biến và mọi phương thức đều trả chuỗi mới.

Khái niệm cốt lõi

Chuỗi trong Python có hơn 40 phương thức. Không cần nhớ hết; nhớ nhóm và tra dir(str) khi cần. Bài này đi qua nhóm dùng hằng ngày trong làm sạch dữ liệu.

code
raw = "  Data,SQL,Python  "
print(raw.strip().split(","))
code
['Data', 'SQL', 'Python']

Một dòng, hai bước: strip() bỏ khoảng trắng hai đầu, split(",") tách theo dấu phẩy. Đây chính là cách đọc một dòng CSV đơn giản trước khi cần đến thư viện csv.

Mọi phương thức chuỗi đều trả về chuỗi mới, không sửa tại chỗ:

code
name = "an"
name.upper()
print(name)
code
an

Kết quả upper() bị bỏ vì không gán lại. Viết name = name.upper() hoặc name.upper() ngay trong biểu thức. Đây là lỗi im lặng — chương trình chạy, không báo gì, nhưng dữ liệu không đổi.

Nhóm làm sạch

Phương thứcViệc nó làm
strip()Bỏ khoảng trắng (hoặc ký tự chỉ định) hai đầu
lstrip() / rstrip()Chỉ bỏ bên trái / bên phải
lower() / upper()Đổi hoa thường
title() / capitalize()Viết hoa đầu từ / đầu chuỗi
casefold()Chuẩn hoá mạnh hơn lower(), dùng khi so sánh
code
print("  an@example.com  ".strip().upper())
print("__data__".strip("_"))
print("Hà Nội".lower())
code
AN@EXAMPLE.COM
data
hà nội

strip("_") bỏ mọi ký tự _ ở hai đầu, không chỉ một cặp. strip() không có tham số bỏ mọi loại khoảng trắng: dấu cách, tab, xuống dòng.

Trong dữ liệu thật, chuỗi có thể chứa ký tự không nhìn thấy như non-breaking space (\xa0) từ Excel hoặc HTML. strip() không bỏ ký tự này. Cần xử lý riêng:

code
text = "An\xa0"
print(repr(text.strip()))
print(repr(text.replace("\xa0", " ").strip()))

Tách và ghép

code
line = "An,28,Hà Nội"
parts = line.split(",")
print(parts)
print(len(parts))
print(line.split(",", maxsplit=1))
code
['An', '28', 'Hà Nội']
3
['An', '28,Hà Nội']

maxsplit giới hạn số lần tách — hữu ích khi phần còn lại có thể chứa dấu phân cách (ví dụ địa chỉ có dấu phẩy).

split() không tham số tách theo mọi khoảng trắng và bỏ khoảng trắng thừa, khác split(" "):

code
print("An   Nguyễn".split())
print("An   Nguyễn".split(" "))
code
['An', 'Nguyễn']
['An', '', '', 'Nguyễn']

Đây là lý do nên dùng split() trần khi tách từ.

Ghép ngược lại bằng join:

code
print(" | ".join(["Data", "SQL", "Python"]))
print(",".join(["An", "Bình"]))
code
Data | SQL | Python
An,Bình

join được gọi trên dấu phân cách, nhận iterable chuỗi. Nếu danh sách chứa số, phải ép kiểu trước: ",".join(map(str, nums)).

Tách dòng: "a\nb".splitlines() trả ['a', 'b'] và xử lý đúng cả \r\n trên Windows.

Tìm và thay thế

code
s = "Data Analysis with Python"
print(s.find("Python"))
print(s.count("a"))
print(s.replace("Python", "SQL"))
print(s.startswith("Data"), s.endswith("Python"))
code
19
4
Data Analysis with SQL
True True
  • find() trả chỉ số đầu tiên hoặc -1 nếu không thấy. index() giống nhưng ném ValueError — dùng khi chắc chắn phải có.
  • count() đếm số lần xuất hiện, phân biệt hoa thường.
  • replace() thay tất cả; tham số thứ ba giới hạn số lần.
  • startswith() / endswith() nhận tuple để kiểm tra nhiều khả năng: s.endswith((".csv", ".xlsx")).

Kiểm tra thành viên bằng in:

code
print("SQL" in s, "sql" in s)
code
True False

in phân biệt hoa thường. Muốn không phân biệt, chuẩn hoá cả hai phía: "sql" in s.lower().

Cắt chuỗi

code
code = "VN-2025-001"
print(code[:2])
print(code[3:7])
print(code[-3:])
print(code[::-1])
code
VN
2025
001
100-5202-NV

Cú pháp [start:stop:step], stop không bao gồm. Chỉ số âm đếm từ cuối. [::-1] đảo chuỗi — cách viết gọn nhưng với dữ liệu lớn nên dùng cách rõ ràng hơn.

Cắt chuỗi không bao giờ ném lỗi khi vượt biên:

code
print(code[100:])
code
(empty)

Khác với truy cập một chỉ số: code[100] ném IndexError.

Kiểm tra loại ký tự

Phương thứcTrue khi
isdigit()Toàn chữ số (kể cả số Unicode)
isdecimal()Chỉ chữ số thập phân
isalpha()Toàn chữ cái
isalnum()Chữ và/hoặc số, không khoảng trắng
isspace()Toàn khoảng trắng

isdigit() trả True cho "²" (chữ số trên), nhưng int("²") lỗi. Khi cần kiểm tra để ép kiểu, isdecimal() an toàn hơn — hoặc cứ dùng try/except và để Python quyết định.

Thực hành

  1. Làm sạch " Data,SQL,Python " thành danh sách ba phần tử.
  2. Ghép danh sách ["An", "Bình", "Chi"] bằng " | ".
  3. Đếm chữ a trong một câu bất kỳ, không phân biệt hoa thường.
  4. Kiểm tra một tên file kết thúc bằng .csv hoặc .xlsx.
  5. Cắt mã "VN-2025-001" lấy năm và số thứ tự.
  6. Thử name.upper() mà không gán lại và giải thích vì sao name không đổi.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Chuỗi không đổi sau strip()Không gán kết quảx = x.strip()
split(" ") tạo phần tử rỗngNhiều khoảng trắng liền nhauDùng split() trần
join báo TypeErrorDanh sách chứa sốmap(str, ...)
find() trả -1Không tìm thấyKiểm tra hoặc dùng index()
in không khớp dù thấy bằng mắtKhác hoa thường hoặc có ký tự ẩnChuẩn hoá lower()/strip()
IndexError khi cắtTruy cập bằng chỉ số, không phải sliceDùng [start:stop]
So sánh chuỗi Unicode lạDạng tổ hợp khác nhauunicodedata.normalize

Lỗi cuối ít gặp nhưng khó chẩn đoán: "é" có thể được lưu dưới hai dạng Unicode (một ký tự hoặc e + dấu sắc tổ hợp). Hai chuỗi trông giống hệt nhưng == trả False. Chuẩn hoá NFC trước khi so sánh nếu dữ liệu đến từ nhiều nguồn.

Tóm tắt

  • strip, split, join là bộ ba làm sạch dữ liệu.
  • split() trần tách theo khoảng trắng và bỏ phần rỗng.
  • Chuỗi bất biến: mọi phương thức trả chuỗi mới, phải gán lại.
  • find trả -1, index ném lỗi; count phân biệt hoa thường.
  • Slice không ném IndexError; truy cập chỉ số thì có.

Use ← → to move between lessons