| Ngày 35 – Python hằng ngày 365 ngày – Tạo…

Được viết bởi Đặng Trí Thanh vào ngày 27/06/2026 lúc 23:55 | 34 lượt xem

🐍 Ngày 35 – Python hằng ngày 365 ngày – Tạo và ghi file

🎯 Mục tiêu

Học cách tạo, ghi và đọc file văn bản (.txt) trong Python.

🧠 Kiến thức chính

  • Dùng open(“filename”, “mode”) để mở file:
    • “w”: ghi mới (xoá nội dung cũ nếu có)
    • “a”: ghi tiếp vào cuối file
    • “r”: chỉ đọc
  • Nên dùng with open(…) để đảm bảo đóng file tự động.

📦 Ví dụ: Ghi và đọc file

# Ghi nội dung vào file
with open("demo.txt", "w", encoding="utf-8") as f:
    f.write("Xin chào Python!n")
    f.write("Hôm nay là ngày 35n")

# Đọc lại nội dung file
with open("demo.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)

📂 Sau khi chạy, bạn sẽ thấy file demo.txt trong thư mục hiện tại.

📝 Bài tập thực hành

Bài 1: Tạo file note.txt và ghi 3 dòng bất kỳ

Bài 2: Ghi danh sách vào file

lines = ["Dòng 1", "Dòng 2", "Dòng 3"]
  • Ghi từng dòng vào file lines.txt (mỗi phần tử 1 dòng)
  • Đọc lại nội dung và in ra màn hình.

💡 Gợi ý

  • Dùng vòng lặp for để ghi nhiều dòng.
  • Dùng f.write(line + “n”) để đảm bảo mỗi dòng cách dòng.

📌 Ghi chú

  • File sẽ nằm cùng thư mục với file Python nếu không chỉ định đường dẫn cụ thể.
  • Dùng os.path.exists() để kiểm tra file có tồn tại không trước khi đọc.

🚀 Bắt đầu với Python

Image

Bạn có thể mở bài học này trên Google Colab để chạy trực tiếp:

Colab Badge

📺 Ngày 35 – Tạo và ghi file trong Python

Trong video này, bạn sẽ học cách tạo và ghi file trong Python bằng các chế độ "w" và "a". Một kỹ năng cực kỳ quan trọng để lưu trữ dữ liệu hoặc log!

https://www.tiktok.com/embed/v2/7492630437529980178

in Sự kiện

Mở rộng — Bảng tổng hợp các chế độ mở file

Việc chọn đúng chế độ mở file quyết định chương trình chạy đúng hay lỗi dữ liệu. Bảng dưới đây tổng hợp các chế độ thường dùng nhất.

Chế độ Ý nghĩa Nếu file chưa tồn tại
r Chỉ đọc Lỗi FileNotFoundError
w Ghi đè từ đầu Tạo file mới
a Ghi tiếp cuối file Tạo file mới
r+ Đọc + ghi (không xoá) Lỗi FileNotFoundError
w+ Ghi + đọc (xoá cũ) Tạo file mới
a+ Ghi tiếp + đọc Tạo file mới
rb / wb Nhị phân (binary) Theo chế độ b/
# [CÁC CHẾ ĐỘ - PYTHON]
# Ghi đè
with open("a.txt", "w", encoding="utf-8") as f:
    f.write("Nội dung mới")

# Ghi tiếp
with open("log.txt", "a", encoding="utf-8") as f:
    f.write("2026-08-15 10:00 - them dong log")

# Đọc
with open("a.txt", "r", encoding="utf-8") as f:
    print(f.read())

encoding=”utf-8″ — vì sao quan trọng?

Nếu không khai báo encoding, Python trên Windows mặc định dùng mã ký tự hệ thống, dễ gây lỗi khi đọc/ghi tiếng Việt. Luôn khai báo encoding="utf-8" để file chứa dấu đọc đúng ở mọi nơi.

Mở rộng — Đọc file lớn theo dòng (không tốn RAM)

Khi file hàng triệu dòng (log bot, dữ liệu tick), bạn không nên dùng f.read() vì sẽ nạp toàn bộ vào RAM. Hãy duyệt từng dòng.

# [ĐỌC FILE LỚN - PYTHON]
with open("tick_data.csv", "r", encoding="utf-8") as f:
    for line in f:
        # xử lý từng dòng ngay lập tức
        if "ERROR" in line:
            print(line.strip())

Vòng lặp for line in f đọc dòng một, rất tiết kiệm bộ nhớ kể cả với file vài GB.

Đếm số dòng nhanh

# [ĐẾM DÒNG - PYTHON]
count = 0
with open("data.txt", "r", encoding="utf-8") as f:
    for _ in f:
        count += 1
print("Tổng dòng:", count)

Mở rộng — Làm việc với pathlib thay vì chuỗi đường dẫn

Thư viện pathlib giúp xử lý đường dẫn an toàn trên mọi hệ điều hành, tránh lỗi dấu gạch chéo khi chuyển giữa Windows và Linux (quan trọng khi bạn chạy bot trên VPS Ubuntu).

# [PATHLIB - PYTHON]
from pathlib import Path

# tạo đường dẫn
data_dir = Path("data")
data_dir.mkdir(exist_ok=True)

file_path = data_dir / "log.txt"   # dùng dấu / cho mọi OS

# ghi file
file_path.write_text("Hello from pathlib", encoding="utf-8")

# đọc file
content = file_path.read_text(encoding="utf-8")
print(content)

# kiểm tra tồn tại
if file_path.exists():
    print("File co ton tai")

Bảng so sánh os.path vs pathlib

Thao tác os.path pathlib
Ghép đường dẫn os.path.join(…) Path / “name”
Kiểm tra tồn tại os.path.exists(…) Path.exists()
Đọc file open(…) Path.read_text()
Lấy tên file os.path.basename(…) Path.name

Mở rộng — Đọc ghi CSV và JSON (dữ liệu cấu trúc)

File text thường dùng để lưu dữ liệu có cấu trúc: CSV cho bảng số liệu, JSON cho cấu hình và API. Đây là kỹ năng bắt buộc khi làm bot giao dịch.

# [CSV - PYTHON]
import csv

# ghi CSV
with open("trades.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["symbol", "side", "price", "qty"])
    writer.writerow(["EURUSD", "buy", 1.0850, 0.10])
    writer.writerow(["BTCUSD", "sell", 61000, 0.001])

# đọc CSV
with open("trades.csv", "r", encoding="utf-8") as f:
    for row in csv.reader(f):
        print(row)
# [JSON - PYTHON]
import json

config = {"symbols": ["EURUSD", "XAUUSD"], "risk_pct": 0.01}

# ghi JSON
with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, ensure_ascii=False, indent=2)

# đọc JSON
with open("config.json", "r", encoding="utf-8") as f:
    cfg = json.load(f)
print(cfg["symbols"])

Lưu ý: json.dump với ensure_ascii=False giúp tiếng Việt hiển thị đúng trong file.

Mở rộng — Ứng dụng thực tế: ghi log và cấu hình cho bot giao dịch

File I/O là nền tảng của mọi bot: bot cần lưu cấu hình, ghi log mỗi lệnh và lưu trạng thái để khởi động lại mà không mất dữ liệu.

Ghi log lệnh giao dịch

# [LOG BOT - PYTHON]
from datetime import datetime

def log_trade(symbol, side, price, qty):
    line = f"{datetime.now():%Y-%m-%d %H:%M:%S} | {symbol} | {side} | {price} | {qty}"
    with open("trades.log", "a", encoding="utf-8") as f:
        f.write(line + "n")
    return line

log_trade("EURUSD", "BUY", 1.0850, 0.10)
log_trade("XAUUSD", "SELL", 2350.5, 0.05)

Lưu trạng thái bot để khởi động lại an toàn

# [TRẠNG THÁI BOT - PYTHON]
import json

state = {"position": "open", "ticket": 12345, "symbol": "EURUSD"}

# ghi trạng thái
with open("bot_state.json", "w", encoding="utf-8") as f:
    json.dump(state, f, ensure_ascii=False, indent=2)

# đọc lại khi khởi động
with open("bot_state.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)
print(loaded)

Bảng: nên dùng file gì cho việc gì?

Loại dữ liệu Định dạng Vì sao
Log sự kiện .log / .txt Ghi tiếp (append) đơn giản
Cấu hình .json Dễ đọc, dễ chỉnh sửa
Bảng số liệu .csv Mở được bằng Excel
Dữ liệu nhị phân .bin / .dat Kích thước nhỏ, nhanh

Mở rộng — Xử lý lỗi khi làm việc với file

Chương trình chạy thực tế sẽ gặp lỗi: file không tồn tại, thiếu quyền ghi, đĩa đầy. Hãy bọc bằng try/except để bot không sập giữa chừng.

# [XỬ LÝ LỖI - PYTHON]
try:
    with open("important.txt", "r", encoding="utf-8") as f:
        content = f.read()
except FileNotFoundError:
    print("File chua ton tai - tao file moi")
    with open("important.txt", "w", encoding="utf-8") as f:
        f.write("khoi tao")
except PermissionError:
    print("Khong co quyen ghi file - kiem tra thu muc")
except Exception as e:
    print("Loi khac:", e)

Ghi file an toàn (atomic write)

Nếu bot sập giữa lúc ghi, file có thể hỏng nửa chừng. Mẹo: ghi vào file tạm rồi đổi tên.

# [ATOMIC WRITE - PYTHON]
import os

def atomic_write(path, text):
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8") as f:
        f.write(text)
    os.replace(tmp, path)   # đổi tên là thao tác nguyên tử

atomic_write("config.json", '{"risk": 0.01}')

Mở rộng — Lời giải bài tập Ngày 35

Bài 1: Tạo note.txt ghi 3 dòng

# [GIẢI BÀI 1 - PYTHON]
with open("note.txt", "w", encoding="utf-8") as f:
    f.write("Dòng 1: học Python
")
    f.write("Dòng 2: ghi file
")
    f.write("Dòng 3: thành thạo
")

with open("note.txt", "r", encoding="utf-8") as f:
    print(f.read())

Bài 2: Ghi danh sách vào file

# [GIẢI BÀI 2 - PYTHON]
lines = ["Dòng 1", "Dòng 2", "Dòng 3"]

# ghi từng phần tử một dòng
with open("lines.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "n")

# đọc lại
with open("lines.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())

Thử thách thêm

  • Thêm dòng mới vào cuối lines.txt mà không xoá dữ liệu cũ.
  • Đọc số dòng, số ký tự của một file bất kỳ.
  • Ghi log kèm thời gian bằng datetime.

Mở rộng — Làm việc với thư mục và nhiều file

Bot thực tế thường xử lý hàng loạt file trong một thư mục: dữ liệu theo ngày, log theo phiên, cấu hình theo từng cặp tiền.

# [DUYỆT THƯ MỤC - PYTHON]
from pathlib import Path
import csv

data_dir = Path("data")
data_dir.mkdir(exist_ok=True)

# tạo nhiều file CSV mỗi ngày
import datetime
today = datetime.date.today()
for i in range(3):
    day = today - datetime.timedelta(days=i)
    f = data_dir / f"trades_{day}.csv"
    f.write_text("symbol,price
", encoding="utf-8")

# duyệt toàn bộ file .csv trong thư mục
for f in data_dir.glob("*.csv"):
    print(f.name, f.stat().st_size, "bytes")

Bảng các thao tác thư mục phổ biến

Thao tác pathlib Ý nghĩa
Tạo thư mục Path.mkdir(exist_ok=True) Tạo nếu chưa có
Liệt kê file dir.glob(“*.csv”) Lọc theo mẫu
Kích thước file f.stat().st_size Kiểm tra dung lượng
Xoá file f.unlink() Dọn dữ liệu cũ
Đổi tên f.rename(…) Tổ chức lại file

Mở rộng — Câu hỏi thường gặp Ngày 35

Vì sao nội dung tiếng Việt bị lỗi font?

Thiếu encoding="utf-8" khi mở file. Luôn khai báo để đảm bảo dấu hiển thị đúng.

Ghi bằng “w” có làm mất dữ liệu cũ không?

Có. “w” xoá nội dung cũ. Muốn giữ, dùng “a” (ghi tiếp) hoặc “r+” (đọc-ghi không xoá).

File tạo ra nằm ở đâu?

Mặc định cùng thư mục chạy chương trình. Dùng đường dẫn tuyệt đối hoặc pathlib để kiểm soát.

Khi nào cần mở file ở chế độ nhị phân?

Khi làm việc với ảnh, âm thanh, file nén, hoặc dữ liệu hiệu năng cao cần lưu trực tiếp kiểu dữ liệu.

Mở rộng — Làm việc với file CSV dữ liệu thị trường

Dữ liệu giá từ sàn thường được xuất dạng CSV. Biết đọc CSV đúng cách giúp bạn phân tích nhanh chóng bằng chính kiến thức Ngày 35.

# [ĐỌC CSV THỊ TRƯỜNG - PYTHON]
import csv

# file mẫu: time,open,high,low,close,volume
rows = []
with open("eurusd_m1.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        rows.append(row)

print("Tổng số nến:", len(rows))
print("Nến đầu tiên:", rows[0])

Lọc dữ liệu theo điều kiện

# [LỌC DỮ LIỆU - PYTHON]
# chỉ giữ nến có volume lớn
big = [r for r in rows if int(r["volume"]) > 1000]
print("Số nến volume lớn:", len(big))

Mở rộng — Xử lý file khi nhiều tiến trình cùng ghi (Concurrency)

Bot chạy nhiều tiến trình (ví dụ một tiến trình mỗi cặp tiền) cùng ghi một file log có thể đè lên nhau. Có vài cách xử lý an toàn.

Cách 1: Mở chế độ append

Chế độ “a” giúp mỗi lần ghi được nối vào cuối file, giảm nguy cơ đè dữ liệu giữa các tiến trình.

Cách 2: Mỗi tiến trình một file riêng

# [FILE RIÊNG - PYTHON]
# mỗi cặp tiền một file log riêng
def log_for_symbol(symbol, msg):
    with open(f"log_{symbol}.txt", "a", encoding="utf-8") as f:
        f.write(msg + "n")

log_for_symbol("EURUSD", "open 0.10 buy")
log_for_symbol("XAUUSD", "close 0.05 sell")

Cách 3: Ghi vào hàng đợi rồi flush tập trung

Trong hệ thống lớn, các tiến trình gửi log về một nơi ghi duy nhất, tránh xung đột hoàn toàn.

Mở rộng — Đọc ghi file nhị phân cơ bản

Khi cần lưu nhanh số liệu lớn, file nhị phân tiết kiệm không gian hơn text. Python hỗ trợ qua module struct hoặc pickle.

# [PICKLE - PYTHON]
import pickle

data = {"symbol": "EURUSD", "prices": [1.0850, 1.0855, 1.0849]}

# ghi nhị phân
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)

# đọc lại
with open("data.pkl", "rb") as f:
    loaded = pickle.load(f)
print(loaded)

Khi nào dùng pickle?

  • Lưu trạng thái bot cần khôi phục chính xác.
  • Cache dữ liệu đã xử lý để chạy lại nhanh.
  • Khi không cần đọc bằng công cụ ngoài (như Excel).

Mở rộng — Tổng kết Ngày 35 và bài tập cuối

Hôm nay bạn đã nắm: mở file với đúng chế độ, ghi/đọc tiếng Việt đúng encoding, duyệt file lớn theo dòng, làm việc với thư mục, CSV/JSON, nhị phân và xử lý lỗi. Đây là nền tảng để mọi bot lưu dữ liệu bền vững.

Bài tập tổng hợp

  1. Tạo file trades.csv ghi 10 lệnh giả (symbol, side, price, qty).
  2. Đọc lại và tính tổng qty theo từng symbol.
  3. Lưu cấu hình bot vào config.json và đọc khi khởi động.
  4. Ghi log mỗi lệnh kèm thời gian, xử lý lỗi nếu file không ghi được.

Nếu bạn hoàn thành cả 4 bài, bạn đã sẵn sàng cho các ngày tiếp theo của chuỗi “Python hằng ngày 365 ngày”.

Mở rộng — Bài tập nâng cao Ngày 35 (kèm gợi ý)

Bài A: Đếm số dòng, số từ trong một file văn bản

# [ĐẾM TỪ - PYTHON]
with open("bai_viet.txt", "r", encoding="utf-8") as f:
    text = f.read()

lines = text.count("n") + 1
words = len(text.split())
chars = len(text)
print(f"Dòng: {lines}, Từ: {words}, Ký tự: {chars}")

Bài B: Gộp nhiều file log thành một file tổng

# [GỘP FILE - PYTHON]
from pathlib import Path

log_dir = Path("logs")
out = "all_logs.txt"

with open(out, "w", encoding="utf-8") as target:
    for f in sorted(log_dir.glob("*.log")):
        target.write(f"===== {f.name} =====n")
        target.write(f.read_text(encoding="utf-8"))
        target.write("n")

print("Đã gộp toàn bộ log vào", out)

Bài C: Tạo file cấu hình tự động cho bot

# [CẤU HÌNH TỰ ĐỘNG - PYTHON]
import json
from pathlib import Path

cfg = {
    "symbol": "EURUSD",
    "lot": 0.10,
    "risk_pct": 0.01,
    "notify_telegram": True,
    "chat_id": "123456",
}

path = Path("bot_config.json")
if not path.exists():
    path.write_text(json.dumps(cfg, ensure_ascii=False, indent=2),
                    encoding="utf-8")
    print("Đã tạo cấu hình mới")
else:
    print("Cấu hình đã tồn tại, không ghi đè")

Mở rộng — Ứng dụng: bot lưu trạng thái và khôi phục khi khởi động lại

Một bot chạy 24/7 sẽ được khởi động lại (cập nhật hệ thống, mất điện). Bot cần đọc lại trạng thái từ file để không bỏ sót lệnh hoặc vào lệnh trùng.

# [KHÔI PHỤC TRẠNG THÁI - PYTHON]
import json
from pathlib import Path

state_file = Path("bot_state.json")

def save_state(state):
    state_file.write_text(json.dumps(state, ensure_ascii=False),
                          encoding="utf-8")

def load_state():
    if state_file.exists():
        return json.loads(state_file.read_text(encoding="utf-8"))
    return {"position": "flat", "last_seq": 0}

# khởi động: đọc trạng thái
st = load_state()
print("Khôi phục:", st)

# sau khi xử lý lệnh: lưu lại
st["position"] = "open"
st["last_seq"] += 1
save_state(st)

Tóm tắt quy trình lưu trạng thái an toàn

  1. Luôn ghi file tạm rồi đổi tên (atomic write).
  2. Đọc lại file khi khởi động để phục hồi trạng thái.
  3. Sao lưu file cấu hình và trạng thái định kỳ.

Những kỹ thuật Ngày 35 này chính là nền móng để bạn xây bot giao dịch bền vững trong các bài học tiếp theo.

Trader hiện đại và python hằng ngày 365

Trader chuyên nghiệp ngày nay không chỉ đọc biểu đồ mà còn dùng python hằng ngày 365 để tự động hóa phân tích, kiểm tra chiến lược và quản lý rủi ro. Python giúp biến ý tưởng thành công cụ một cách nhanh chóng.

Bài viết trình bày chi tiết về python hằng ngày 365, từ thiết lập môi trường đến ví dụ áp dụng thực tế trong quy trình giao dịch hằng ngày.

Thiết lập môi trường nhanh

# Cài đặt các thư viện cần thiết
pip install pandas numpy matplotlib requests
# kiểm tra phiên bản
import pandas as pd
print(pd.__version__)

Sau khi cài đặt, bạn có thể bắt đầu nạp dữ liệu giá, tính chỉ báo và vẽ biểu đồ. Quy trình lặp nhanh giúp bạn thử nghiệm nhiều ý tưởng trong thời gian ngắn.

Các bài toán thường gặp của trader

Bài toán Mô tả Thư viện
Tải giá Lấy OHLCV từ sàn requests, ccxt
Tính chỉ báo SMA, RSI, MACD pandas, ta-lib
Backtest Mô phỏng chiến lược backtrader, vectorbt
Cảnh báo Thông báo tín hiệu telegram, twilio
Quản lý vốn Tính khối lượng numpy

Ví dụ: tính RSI và phát hiện tín hiệu

def rsi(close, period=14):
    delta = close.diff()
    gain = delta.clip(lower=0).rolling(period).mean()
    loss = (-delta.clip(upper=0)).rolling(period).mean()
    rs = gain / loss
    return 100 - (100 / (1 + rs))
df['rsi'] = rsi(df['close'])
print(df[['close', 'rsi']].tail())

RSI trên 70 cho thấy vùng quá mua, dưới 30 là quá bán. Đây là tín hiệu tham khảo, cần kết hợp thêm xu hướng và khối lượng trước khi vào lệnh.

Sai lầm phổ biến và cách tránh

Sai lầm Vì sao nguy hiểm Cách tránh
Dùng dữ liệu demo thay live Không đúng thực tế Kiểm tra dữ liệu thật
Bỏ qua phí & trượt giá Lợi nhuận ảo Mô phỏng chi phí thực
Overfitting tham số Chiến lược không ổn định Giữ tham số ít, hợp lý
Không kiểm soát rủi ro Cháy tài khoản Đặt stop loss mọi lệnh

Câu hỏi thường gặp về python hằng ngày 365

Tôi mới bắt đầu, học python hằng ngày 365 từ đâu?

Bắt đầu từ việc nạp dữ liệu và tính chỉ báo cơ bản. Làm được hai việc này, bạn đã có nền tảng để xây dựng công cụ của riêng mình.

Có cần giỏi toán không?

Chỉ cần kiến thức thống kê cơ bản. Các thư viện đã đóng gói sẵn hầu hết phép tính, bạn chỉ cần hiểu ý nghĩa để dùng đúng.

Dùng bot tự động có an toàn không?

An toàn khi bạn hiểu rõ logic, quản lý rủi ro tốt và giám sát thường xuyên. Chạy demo trước khi dùng tiền thật.

Kết luận

Python Hằng Ngày 365 giúp trader tiết kiệm thời gian, tăng độ chính xác và giảm căng thẳng. Hãy xây dựng từng bước, kiểm chứng kỹ lưỡng và luôn ưu tiên quản lý rủi ro.

Đặng Trí Thanh

Đặng Trí Thanh

Giám đốc Công nghệ · DNT Digital · Giảng viên HNDL
852 Bài viết
15.4k Người theo dõi
120k+ Lượt đọc

Đặng Trí Thanh — Founder & CTO · Hướng Nghiệp Dữ Liệu - DNT Digital. Chuyên đào tạo và triển khai thực chiến Python, MT5 và hệ thống bot auto trading / IB cho học viên và doanh nghiệp.