Lộ trình học Python cho Automation/Scripting
Giới thiệu
Python là ngôn ngữ lý tưởng cho tự động hóa và scripting nhờ cú pháp đơn giản, thư viện phong phú và khả năng tích hợp cao. Bài viết này sẽ hướng dẫn bạn từng bước để trở thành chuyên gia tự động hóa với Python.
1. Kiến thức nền tảng
1.1. Cú pháp Python cơ bản
- Biến, kiểu dữ liệu, toán tử
- Cấu trúc điều khiển (if-else, loops)
- Hàm và module
- Xử lý ngoại lệ (try-except)
1.2. Làm việc với file và thư mục
- Đọc/ghi file (open, read, write)
- Quản lý đường dẫn (os.path)
- Duyệt thư mục (os.walk)
2. Công cụ tự động hóa cơ bản
2.1. os và sys
- Tương tác với hệ điều hành
- Quản lý biến môi trường
- Thực thi lệnh hệ thống
2.2. subprocess
- Chạy lệnh shell
- Quản lý input/output
- Xử lý lỗi
2.3. shutil
- Sao chép, di chuyển file
- Nén/giải nén
- Quản lý phân quyền
3. Tự động hóa nâng cao
3.1. Selenium
- Tự động hóa trình duyệt
- Web scraping
- Kiểm thử UI
3.2. PyAutoGUI
- Tự động hóa chuột/bàn phím
- Nhận diện hình ảnh
- Tự động hóa GUI
3.3. Schedule
- Lập lịch tác vụ
- Cron jobs
- Tự động hóa định kỳ
4. Tích hợp và API
4.1. REST API
- Requests library
- JSON handling
- Authentication
4.2. Database Automation
- SQLite
- MySQL/PostgreSQL
- ORM (SQLAlchemy)
4.3. Cloud Services
- AWS SDK (boto3)
- Google Cloud
- Azure SDK
5. Dự án thực tế
5.1. File Management System
- Tự động sắp xếp file
- Backup tự động
- Tìm kiếm và phân loại
5.2. Web Automation
- Tự động đăng nhập
- Form filling
- Data extraction
5.3. System Monitoring
- Kiểm tra tài nguyên
- Alert system
- Log analysis
6. Best Practices
6.1. Code Organization
- Modular design
- Configuration management
- Error handling
6.2. Testing
- Unit testing
- Integration testing
- Continuous Integration
6.3. Documentation
- Code comments
- README files
- API documentation
7. Tài nguyên học tập
7.1. Khóa học
- Automate the Boring Stuff with Python
- Python for Automation
- Selenium WebDriver with Python
7.2. Sách
- "Python Automation Cookbook"
- "Mastering Python Scripting"
- "Automate Everything with Python"
7.3. Cộng đồng
- Stack Overflow
- GitHub
- Python Discord
8. Các dự án thực tế chi tiết
8.1. File Management System
- Tự động sắp xếp file: Sử dụng Python để quét thư mục và di chuyển file vào các thư mục con dựa trên loại file (ví dụ: .pdf, .docx, .jpg).
- Backup tự động: Tạo script để sao lưu dữ liệu định kỳ, có thể tích hợp với các dịch vụ lưu trữ đám mây như Google Drive hoặc Dropbox.
- Tìm kiếm và phân loại: Xây dựng công cụ tìm kiếm file nhanh chóng, hỗ trợ tìm kiếm theo tên, loại file, hoặc nội dung.
8.2. Web Automation
- Tự động đăng nhập: Sử dụng Selenium để tự động đăng nhập vào các trang web, giúp tiết kiệm thời gian cho các tác vụ lặp lại.
- Form filling: Tự động điền thông tin vào các form trên web, hữu ích cho việc đăng ký hoặc gửi dữ liệu.
- Data extraction: Trích xuất dữ liệu từ các trang web, có thể sử dụng BeautifulSoup hoặc Scrapy để thu thập thông tin.
8.3. System Monitoring
- Kiểm tra tài nguyên: Giám sát CPU, RAM, và ổ đĩa, gửi cảnh báo khi tài nguyên sắp hết.
- Alert system: Tích hợp với các dịch vụ nhắn tin như Slack hoặc email để gửi thông báo khi có sự cố.
- Log analysis: Phân tích log hệ thống để phát hiện lỗi hoặc hoạt động bất thường, giúp tối ưu hóa hiệu suất.
Bốn ví dụ tự động hóa thực tế có code đầy đủ
1. Tự động dọn dẹp và phân loại file
import shutil
from pathlib import Path
from datetime import datetime
NHOM_FILE = {
"Hinh anh": {".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg"},
"Tai lieu": {".pdf", ".doc", ".docx", ".txt", ".md"},
"Bang tinh": {".xls", ".xlsx", ".csv"},
"Nen": {".zip", ".rar", ".7z", ".tar", ".gz"},
"Video": {".mp4", ".mov", ".avi", ".mkv"},
"Am thanh": {".mp3", ".wav", ".flac"},
}
def phan_loai_file(thu_muc: Path, mo_phong: bool = True) -> dict:
"""Dọn dẹp thư mục tải về — nhóm file theo loại.
Luôn chạy `mo_phong=True` trước để xem sẽ làm gì!
"""
thong_ke = {}
for file in thu_muc.iterdir():
if not file.is_file() or file.name.startswith("."):
continue
duoi = file.suffix.lower()
nhom = next((n for n, ds in NHOM_FILE.items() if duoi in ds), "Khac")
thu_muc_dich = thu_muc / nhom
if mo_phong:
print(f"[MÔ PHỎNG] {file.name} → {nhom}/")
else:
thu_muc_dich.mkdir(exist_ok=True)
# Xử lý trùng tên: thêm timestamp
dich = thu_muc_dich / file.name
if dich.exists():
dich = thu_muc_dich / f"{file.stem}_{int(datetime.now().timestamp())}{duoi}"
shutil.move(str(file), str(dich))
thong_ke[nhom] = thong_ke.get(nhom, 0) + 1
return thong_ke
if __name__ == "__main__":
thu_muc = Path.home() / "Downloads"
print("=== MÔ PHỎNG ===")
phan_loai_file(thu_muc, mo_phong=True)
# Bỏ comment dòng dưới khi đã chắc chắn
# print(phan_loai_file(thu_muc, mo_phong=False))
💡 Thiết kế
mo_phong=Truelà thói quen nghề nghiệp quan trọng. Mọi script có thể xoá hoặc di chuyển dữ liệu đều nên có chế độ chạy thử. Một lỗi trong script dọn file có thể làm mất dữ liệu không phục hồi được.
2. Tổng hợp nhiều file Excel thành một báo cáo
from pathlib import Path
import pandas as pd
def gop_bao_cao(thu_muc: Path, ten_sheet: str = "Sheet1") -> pd.DataFrame:
"""Đọc mọi file .xlsx trong thư mục và gộp thành một DataFrame."""
tat_ca = []
loi = []
for file in sorted(thu_muc.glob("*.xlsx")):
if file.name.startswith("~$"): # file tạm của Excel
continue
try:
df = pd.read_excel(file, sheet_name=ten_sheet, dtype=str)
df["nguon_file"] = file.stem
tat_ca.append(df)
print(f"✓ {file.name}: {len(df)} dòng")
except Exception as e:
loi.append((file.name, str(e)))
print(f"✗ {file.name}: {e}")
if not tat_ca:
raise SystemExit("Không đọc được file nào!")
if loi:
print(f"\n⚠️ {len(loi)} file bị bỏ qua")
return pd.concat(tat_ca, ignore_index=True)
def lam_sach(df: pd.DataFrame, cot_so: list[str]) -> pd.DataFrame:
"""Chuẩn hoá dữ liệu sau khi gộp."""
df = df.copy()
# Bỏ dòng trùng hoàn toàn
df = df.drop_duplicates()
# Chuyển cột số (xử lý định dạng "1,234.5" và "1.234,5")
for cot in cot_so:
if cot not in df.columns:
continue
df[cot] = (
df[cot].astype(str)
.str.replace(r"[^\d,\.\-]", "", regex=True)
.str.replace(".", "", regex=False)
.str.replace(",", ".", regex=False)
)
df[cot] = pd.to_numeric(df[cot], errors="coerce")
# Chuẩn hoá chuỗi
for cot in df.select_dtypes("object").columns:
df[cot] = df[cot].str.strip()
return df
if __name__ == "__main__":
thu_muc = Path("bao-cao-thang")
df = gop_bao_cao(thu_muc)
df = lam_sach(df, ["doanh_thu", "so_luong"])
# Xuất file tổng hợp có nhiều sheet
with pd.ExcelWriter("tong-hop.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="Chi tiết", index=False)
if "khu_vuc" in df.columns and "doanh_thu" in df.columns:
(df.groupby("khu_vuc")["doanh_thu"].sum()
.sort_values(ascending=False)
.reset_index()
.to_excel(writer, sheet_name="Theo khu vực", index=False))
print(f"\n✅ Đã xuất {len(df):,} dòng → tong-hop.xlsx")
⚠️ Bẫy định dạng số là nguyên nhân gây lỗi số một. Cùng một con số có thể là
1,234.5(Mỹ) hoặc1.234,5(Việt Nam). Nếu bạn dùngpd.to_numerictrên"1.234,5", kết quả sẽ sai hoàn toàn. Luôn kiểm tra định dạng dữ liệu nguồn trước.
3. Gửi báo cáo tự động qua email
import smtplib
import os
from email.message import EmailMessage
from pathlib import Path
def gui_email(dinh_kem: Path, tieu_de: str, noi_dung_html: str,
nguoi_nhan: list[str], nguoi_gui: str, mat_khau: str) -> bool:
"""Gửi email có file đính kèm.
Lưu ý: Gmail cần App Password, KHÔNG dùng mật khẩu tài khoản chính.
"""
msg = EmailMessage()
msg["Subject"] = tieu_de
msg["From"] = nguoi_gui
msg["To"] = ", ".join(nguoi_nhan)
msg.set_content("Xem nội dung dạng HTML.")
msg.add_alternative(noi_dung_html, subtype="html")
du_lieu = dinh_kem.read_bytes()
msg.add_attachment(
du_lieu,
maintype="application",
subtype="octet-stream",
filename=dinh_kem.name,
)
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465, timeout=30) as server:
server.login(nguoi_gui, mat_khau)
server.send_message(msg)
return True
except smtplib.SMTPException as e:
print(f"❌ Lỗi gửi email: {e}")
return False
⚠️ Bảo mật: không bao giờ đặt mật khẩu trong code. Dùng
os.environvà biến môi trường. Với Gmail, bật xác thực hai bước và tạo App Password riêng — có thể thu hồi bất cứ lúc nào mà không ảnh hưởng tài khoản chính.
4. Giám sát hệ thống và cảnh báo
import shutil
import psutil
import requests
import logging
from dataclasses import dataclass
logger = logging.getLogger(__name__)
@dataclass
class NguongCanhBao:
cpu_pct: float = 85.0
ram_pct: float = 85.0
disk_pct: float = 90.0
def kiem_tra_tai_nguyen(nguong: NguongCanhBao) -> list[str]:
"""Kiểm tra tài nguyên, trả về danh sách cảnh báo."""
canh_bao = []
cpu = psutil.cpu_percent(interval=1)
if cpu > nguong.cpu_pct:
canh_bao.append(f"CPU {cpu:.1f}% (ngưỡng {nguong.cpu_pct}%)")
ram = psutil.virtual_memory().percent
if ram > nguong.ram_pct:
canh_bao.append(f"RAM {ram:.1f}% (ngưỡng {nguong.ram_pct}%)")
for phan_vung in psutil.disk_partitions():
try:
dung_luong = shutil.disk_usage(phan_vung.mountpoint)
phan_tram = dung_luong.used / dung_luong.total * 100
if phan_tram > nguong.disk_pct:
canh_bao.append(
f"Ổ {phan_vung.mountpoint} đầy {phan_tram:.1f}% "
f"(còn {dung_luong.free / 1e9:.1f} GB)"
)
except PermissionError:
continue
return canh_bao
def gui_canh_bao_slack(webhook_url: str, tin_nhan: str) -> None:
try:
requests.post(webhook_url, json={"text": tin_nhan}, timeout=10)
except requests.RequestException as e:
logger.error("Không gửi được cảnh báo: %s", e)
def chay_giam_sat(webhook_url: str | None = None) -> None:
canh_bao = kiem_tra_tai_nguyen(NguongCanhBao())
if not canh_bao:
logger.info("✅ Hệ thống bình thường")
return
tin_nhan = "🚨 CẢNH BÁO HỆ THỐNG\n" + "\n".join(f"• {c}" for c in canh_bao)
logger.warning(tin_nhan)
if webhook_url:
gui_canh_bao_slack(webhook_url, tin_nhan)
Đặt lịch chạy tự động
| Hệ điều hành | Công cụ | Ví dụ |
|---|---|---|
| Windows | Task Scheduler | Chạy python script.py mỗi ngày 8:00 |
| Linux/macOS | cron | 0 8 * * * /usr/bin/python3 /path/script.py |
| Cloud | GitHub Actions | schedule: - cron: '0 8 * * *' |
| Chuyên nghiệp | Airflow, Prefect | DAG có phụ thuộc, retry, giám sát |
# Cú pháp cron: phút giờ ngày tháng thứ
# 0 8 * * * → 8:00 mỗi ngày
# 30 7 * * 1-5 → 7:30 thứ Hai đến thứ Sáu
# 0 */6 * * * → mỗi 6 giờ
Bảy nguyên tắc viết script tự động hóa tốt
- Luôn có chế độ chạy thử cho script có thể thay đổi dữ liệu.
- Ghi log, đừng chỉ
print. Khi script chạy 3 giờ đêm và lỗi, log là thứ duy nhất giúp bạn. - Xử lý lỗi từng phần. Một file lỗi không nên làm cả script dừng.
- Không hard-code đường dẫn. Dùng
pathlibvà biến môi trường. - Đặt tên file output có ngày.
bao-cao-2026-10-02.xlsxtốt hơnbao-cao.xlsx. - Gửi thông báo thành công. Không chỉ báo lỗi — bạn cần biết script còn chạy.
- Kiểm tra trước khi xoá. Không bao giờ xoá dữ liệu mà không có backup.
Kết luận
Tự động hóa với Python mở ra nhiều cơ hội để tối ưu hóa công việc và tăng hiệu suất. Hãy bắt đầu với những kiến thức cơ bản và dần dần nâng cao kỹ năng thông qua các dự án thực tế.