Vấn đề
Giả sử bạn cần kiểm tra đầu hoặc cuối của một chuỗi cho các mẫu văn bản cụ thể. Các mẫu phổ biến có thể là phần mở rộng tên file nhưng cũng có thể là bất kỳ thứ gì. Dưới đây là các phương pháp để thực hiện.
Phương thức startswith()
Cách đơn giản để kiểm tra đầu chuỗi là dùng phương thức startswith().
Ví dụ 1
text = "Is USA colder than Australia?"
print(f"output \n {text.startswith('Is')}")
Kết quả: True
Ví dụ 2
filename = "Hello_world.txt"
print(f"output \n {filename.startswith('Hello')}")
Kết quả: True
Ví dụ 3
site_url = 'https://www.something.com'
print(f"output \n {site_url.startswith('http:')}")
Kết quả: False
Ví dụ 4
print(f"output \n {site_url.startswith('https:')}")
Kết quả: True
Phương thức endswith()
Cách đơn giản để kiểm tra cuối chuỗi là dùng phương thức endswith().
Ví dụ 1
text = "Is USA colder than Australia?"
print(f"output \n {text.endswith('?')}")
Kết quả: True
Ví dụ 2
filename = "Hello_world.txt"
print(f"output \n {filename.endswith('.txt')}")
Kết quả: True
Kiểm tra nhiều lựa chọn với tuple
Nếu muốn kiểm tra nhiều lựa chọn, cần cung cấp tuple. Ví dụ thường gặp: kiểm tra đuôi file .txt và .csv trong thư mục.
import os
filenames = os.listdir('.')
Kiểm tra xem có file nào khớp không
print(f"output \n {any(name.endswith(('.csv', '.txt')) for name in filenames)}")
Kết quả: True
Liệt kê các file khớp
[name for name in filenames if name.endswith(('.csv', '.txt'))]
Kết quả:
['file1.csv', 'HRDataset.csv', 'Input.csv', 'input.txt', 'input_copy.txt',
'movies_data.csv', 'my_html_data_to_csv.csv', 'temporary_file1_for_zip.csv',
'temporary_file2_for_zip.csv', 'test.csv', 'test1.txt', 'test2.txt',
'tmdb_5000_movies.csv']
Lưu ý quan trọng: Chỉ chấp nhận tuple
Phương thức startswith() và endswith() chỉ chấp nhận chuỗi hoặc tuple chuỗi. Nếu bạn có danh sách (list) lựa chọn, phải chuyển thành tuple.
Sai - dùng list
patters = ['.csv', '.txt']
any(name.endswith(patters) for name in filenames)
Lỗi: TypeError: endswith first arg must be str or a tuple of str, not list
Đúng - chuyển list thành tuple
any(name.endswith(tuple(patters)) for name in filenames)
Kết quả: True
Liệt kê file với tuple
[name for name in filenames if name.endswith(tuple(patters))]
Kết hợp với các phép toán khác
Các phương thức này rất hữu ích khi kết hợp với các phép giảm dữ liệu (data reductions). Ví dụ:
if any(name.endswith(tuple(patters)) for name in filenames):
# thực hiện logic tại đây
pass