Bài 7. Chuỗi và tệp

Chuỗi và tệp là hai thứ bạn dùng hằng ngày: xử lý văn bản, đọc và ghi dữ liệu lên đĩa.

35 phútCơ bản
Bạn sẽ học được
  • Dùng các phương thức xử lý chuỗi
  • Cắt, nối, tìm, thay thế văn bản
  • Đọc và ghi tệp văn bản bằng with open
  • Làm việc với tệp CSV đơn giản
Thuật ngữ cần biết
Chuỗi (str)
Dãy ký tự; không thể sửa từng ký tự, chỉ tạo chuỗi mới.
Phương thức
Hàm gắn với một kiểu dữ liệu, gọi bằng dấu chấm: s.upper().
Mã hóa (encoding)
Cách lưu ký tự thành byte; tiếng Việt dùng utf-8.
Đường dẫn
Vị trí tệp: tuyệt đối hoặc tương đối thư mục hiện tại.

Khái niệm và lý thuyết

Chuỗi là dãy ký tự. Máy lưu mỗi ký tự bằng một mã số theo bảng mã; tiếng Việt cần bảng mã Unicode (UTF-8) để hiển thị đúng dấu. Chuỗi có chỉ số như danh sách (s[0] là ký tự đầu) nhưng không sửa được từng ký tự; mọi phương thức như upper(), replace() đều trả về một chuỗi mới, chuỗi gốc giữ nguyên.

Tệp là nơi dữ liệu được lưu lâu dài trên ổ đĩa. Bộ nhớ trong (RAM) mất dữ liệu khi tắt chương trình, còn tệp thì còn. Làm việc với tệp luôn theo ba bước: mở, đọc hoặc ghi, đóng. Khối with open(...) tự động đóng tệp, tránh quên đóng gây mất dữ liệu hoặc khóa tệp.

Loại tệpĐặc điểmDùng cho
Văn bản (.txt)Chữ thuần, đọc bằng mọi trình soạn thảoGhi chú, nhật ký
CSVBảng, các cột cách nhau dấu phẩyDữ liệu bảng, xuất từ Excel
JSONDữ liệu lồng nhau dạng khóa-giá trịCấu hình, trao đổi dữ liệu web

Đường dẫn có thể tuyệt đối (C:\\du-an\\a.txt) hoặc tương đối so với thư mục đang chạy (du-lieu/a.txt). Đường dẫn tương đối giúp dự án chạy được trên máy khác.

Xử lý chuỗi

s = "  Xin chào Python  "
print(s.strip())              # bỏ khoảng trắng hai đầu
print(s.upper(), s.lower())
print(s.replace("Python", "Việt Nam"))
print("a,b,c".split(","))     # ['a', 'b', 'c']
print("-".join(["a", "b"]))   # a-b
print(s.strip().startswith("Xin"))
print(s.find("chào"))         # vị trí hoặc -1

Đọc và ghi tệp

# Ghi
with open("ghi_chu.txt", "w", encoding="utf-8") as f:
    f.write("Dòng 1\n")
    f.write("Dòng 2\n")

# Đọc cả tệp
with open("ghi_chu.txt", encoding="utf-8") as f:
    noi_dung = f.read()

# Đọc từng dòng
with open("ghi_chu.txt", encoding="utf-8") as f:
    for dong in f:
        print(dong.strip())
Chế độÝ nghĩa
"r"đọc (mặc định)
"w"ghi, xóa nội dung cũ
"a"ghi nối thêm vào cuối

with tự đóng tệp khi xong, kể cả khi có lỗi.

Ví dụ: đếm số từ trong một tệp văn bản

with open("van_ban.txt", encoding="utf-8") as f:
    noi_dung = f.read()
tu = noi_dung.split()
print("Số từ:", len(tu))

with open("ket_qua.txt", "w", encoding="utf-8") as f:
    f.write("Tổng số từ: " + str(len(tu)))

Câu lệnh with tự đóng tệp khi xong, bạn khỏi lo quên. Luôn ghi rõ encoding="utf-8" để tiếng Việt không bị lỗi font. Nếu tệp không tồn tại, Python báo FileNotFoundError; đảm bảo tệp nằm cùng thư mục với chương trình.

Tệp CSV

import csv
with open("diem.csv", encoding="utf-8", newline="") as f:
    for dong in csv.DictReader(f):
        print(dong["ten"], dong["diem"])
Tình huống: Đếm từ trong bài văn

Đọc tệp bai_van.txt, đếm số từ và từ xuất hiện nhiều nhất.

from collections import Counter
with open("bai_van.txt", encoding="utf-8") as f:
    tu = f.read().lower().split()
print(len(tu))
print(Counter(tu).most_common(3))
Mẹo hay

Luôn khai báo encoding="utf-8" khi làm việc với tiếng Việt để tránh lỗi font.

Lưu ý

Chế độ "w" xóa sạch tệp cũ. Muốn giữ dữ liệu cũ hãy dùng "a".

Thực hành
  1. Nhập một câu, in số từ và đảo ngược các từ.
  2. Ghi 10 số ngẫu nhiên vào tệp, rồi đọc lại và tính tổng.
  3. Kiểm tra chuỗi có phải email đơn giản (có @ và dấu chấm).
  4. Viết nhật ký: mỗi lần chạy thêm một dòng kèm thời gian.
Tóm tắt bài học
  • Chuỗi có nhiều phương thức: strip, split, join, replace, find.
  • Dùng with open(...) để đọc/ghi tệp.
  • Chế độ r, w, a; luôn dùng utf-8.
  • Module csv đọc bảng dữ liệu nhanh.