Skip to main content

🐍 Ngày 34 - Python hằng ngày 365 ngày - Làm việc với thư mục và tập tin

· 2 min read

🎯 Mục tiêu

Tìm hiểu cách làm việc với thư mục và tập tin trong Python: tạo, đổi tên, xóa thư mục, kiểm tra sự tồn tại, liệt kê file,...


🧠 Kiến thức cần biết

  • Dùng thư viện osshutil để thao tác với file/folder.
  • Thư viện pathlib (từ Python 3.4) hiện đại hơn và dễ dùng hơn os.

📦 Ví dụ: Tạo thư mục, ghi file, liệt kê và xóa

python
import os
from pathlib import Path

# Tạo thư mục
os.makedirs("./test_folder", exist_ok=True)

# Tạo file trong thư mục
with open("test_folder/hello.txt", "w", encoding="utf-8") as f:
f.write("Xin chào, Python!")

# Liệt kê file trong thư mục
files = os.listdir("test_folder")
print("📁 File trong test_folder:", files)

# Đổi tên file
os.rename("test_folder/hello.txt", "test_folder/xinchao.txt")

# Xóa file
os.remove("test_folder/xinchao.txt")

# Xóa thư mục
os.rmdir("test_folder")

📺 Video hướng dẫn

🔍 Một số hàm hữu ích trong os và pathlib

Mô-đunHàmMô tả
osos.makedirs(path)Tạo thư mục
osos.remove(path)Xóa file
osos.rename(src, dst)Đổi tên file/folder
osos.listdir(path)Liệt kê file trong thư mục
pathlibPath.exists()Kiểm tra tồn tại
pathlibPath().mkdir()Tạo thư mục

Bài tập: Làm việc với Tệp và Thư mục trong Python

1. Viết một script Python để tạo một thư mục tên 'MyFiles' và sau đó tạo ba tệp văn bản trống bên trong nó: 'file1.txt', 'file2.txt', và 'file3.txt'.

2. Viết một hàm Python nhận đường dẫn thư mục làm đầu vào và trả về một danh sách tất cả các tệp (không phải thư mục) trong thư mục đó.

3. Viết một script Python để đổi tên tất cả các tệp trong một thư mục từ '.txt' thành '.log'.

4. Viết một script Python để xóa tất cả các tệp trống trong một thư mục nhất định.

5. Viết một hàm Python để tính tổng kích thước (theo byte) của tất cả các tệp trong một thư mục.

🐍 Ngày 33 - Python hằng ngày 365 ngày - Làm việc với JSON

· 2 min read

🎯 Mục tiêu

Học cách đọc và ghi dữ liệu định dạng JSON trong Python. JSON rất phổ biến khi làm việc với API hoặc lưu trữ dữ liệu cấu trúc như danh sách, từ điển.


🧠 Kiến thức cần biết

  • JSON (JavaScript Object Notation) là định dạng văn bản dùng để lưu trữ và truyền dữ liệu.
  • Trong Python, mô-đun json giúp bạn chuyển đổi giữa kiểu dữ liệu Python (dict, list,...) và JSON.

🛠️ Các hàm chính trong mô-đun json

HàmMô tả
json.dump(obj, file)Ghi một đối tượng Python vào file JSON
json.load(file)Đọc JSON từ file và chuyển thành Python object
json.dumps(obj)Chuyển đối tượng Python thành chuỗi JSON
json.loads(str)Phân tích chuỗi JSON thành Python object

📦 Ví dụ: Lưu và đọc danh sách công việc

import json

# Danh sách công việc
tasks = [
{"task": "Học Python", "status": "pending"},
{"task": "Làm bài tập", "status": "completed"},
]

# Ghi vào file JSON
with open("tasks.json", "w", encoding="utf-8") as f:
json.dump(tasks, f, ensure_ascii=False, indent=2)

# Đọc lại file JSON
with open("tasks.json", "r", encoding="utf-8") as f:
loaded_tasks = json.load(f)

print("✅ Danh sách công việc từ file:")
for task in loaded_tasks:
print(f"- {task['task']} ({task['status']})")

Ảnh minh họa

🎥 Video hướng dẫn:

YouTube:
Xem trên YouTube

TikTok:
👉 Xem video TikTok

Xem video TikTok


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

Bài 1: Tạo file my_profile.json chứa thông tin sau:

{
"name": "Nguyễn Văn A",
"age": 25,
"email": "nguyenvana@example.com",
"skills": ["Python", "Excel", "SQL"]
}

Viết chương trình Python để:

  • Đọc file JSON này và in ra tên, tuổi, email, kỹ năng.

Bài 2: Ghi danh sách học viên vào file students.json

students = [
{"name": "An", "score": 8.5},
{"name": "Bình", "score": 7.0},
{"name": "Chi", "score": 9.2},
]
  • Lưu danh sách vào file.
  • Đọc lại và in học sinh có điểm > 8.

💡 Gợi ý

  • Dùng with open(...) để đọc/ghi file an toàn.
  • Dùng json.dumpjson.load để làm việc với file.
  • Dùng indent=2 giúp định dạng JSON đẹp mắt khi lưu.

📌 Ghi chú

  • JSON không hỗ trợ kiểu dữ liệu set hoặc tuple, hãy chuyển đổi sang list nếu cần lưu.

📅 Ngày 8 – SQL Server 365 ngày Chủ đề: GROUP BY – Nhóm dữ liệu và thống kê

· 2 min read

Chủ đề: GROUP BY – Nhóm dữ liệu và thống kê


✅ Mục tiêu học hôm nay

Sử dụng GROUP BY để nhóm các bản ghi theo một hoặc nhiều cột và kết hợp với hàm tổng hợp như COUNT, SUM, AVG, MAX, MIN.


📘 Câu lệnh mẫu

SELECT Department, COUNT(*) AS TotalEmployees
FROM Employees
GROUP BY Department;

📝 Giải thích:

  • Nhóm tất cả nhân viên theo Department
  • Đếm số nhân viên trong mỗi phòng ban bằng COUNT(*)

🔄 Ví dụ nâng cao

SELECT JobTitle, AVG(Salary) AS AverageSalary
FROM Employees
GROUP BY JobTitle;

📝 Ý nghĩa:

  • Tính lương trung bình của từng chức danh công việc (JobTitle)

🧪 Thực hành

Viết truy vấn SQL để:

  1. Đếm số nhân viên theo JobTitle
  2. Tính tổng lương của mỗi phòng ban (Department)
  3. Tìm lương cao nhất theo từng JobTitle

❓ Câu hỏi trắc nghiệm

Câu lệnh nào sau đây sử dụng GROUP BY đúng cú pháp?

A)

SELECT Department, COUNT(*)
FROM Employees

B)

SELECT Department, COUNT(*)
FROM Employees
GROUP BY Salary;

C)

SELECT Department, COUNT(*)
FROM Employees
GROUP BY Department;

D)

SELECT COUNT(*) FROM Employees GROUP BY;

Đáp án: C


📘 Ngày 9: Cấu trúc Dữ liệu và Giải thuật hằng ngày - Thuật toán Insertion Sort – Sắp xếp chèn

· 3 min read

📝 Yêu cầu

Viết chương trình sắp xếp một danh sách số nguyên theo thứ tự tăng dần bằng thuật toán Insertion Sort.


🔍 Giải thích thuật toán

Insertion Sort là một thuật toán đơn giản hoạt động giống như cách bạn sắp xếp bài trên tay.

  • Ta chia danh sách thành 2 phần:
    • Phần đã sắp xếp (bắt đầu với 1 phần tử đầu tiên).
    • Phần chưa sắp xếp.
  • Từng bước, lấy phần tử đầu tiên của phần chưa sắp xếp, chèn vào đúng vị trí trong phần đã sắp xếp.

🧩 Ví dụ minh họa

Cho danh sách: [5, 2, 4, 6, 1, 3]

BướcDanh sáchMô tả
1[5, 2, 4, 6, 1, 3]Bắt đầu với phần tử đầu tiên
2[2, 5, 4, 6, 1, 3]2 < 5 ⇒ chèn 2 vào trước 5
3[2, 4, 5, 6, 1, 3]4 chèn giữa 2 và 5
4[2, 4, 5, 6, 1, 3]6 đúng vị trí, không đổi
5[1, 2, 4, 5, 6, 3]1 chèn vào đầu danh sách
6[1, 2, 3, 4, 5, 6]3 chèn vào giữa 2 và 4

🧑‍💻 Mã Python: Insertion Sort

def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i] # Phần tử cần chèn
j = i - 1

# Dời các phần tử lớn hơn key sang phải
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1

arr[j + 1] = key # Chèn key vào đúng vị trí

# Nhập danh sách từ người dùng
arr = list(map(int, input("Nhập các số cách nhau bởi dấu cách: ").split()))

insertion_sort(arr)
print("Danh sách sau khi sắp xếp:", arr)

📺 Video hướng dẫn YouTube


🎬 Video chia sẻ nhanh TikTok


📌 Lưu ý

  • Độ phức tạp thời gian:
    • Trường hợp xấu nhất (ngược thứ tự): O(n^2)
    • Trường hợp tốt nhất (đã sắp xếp): O(n)
  • Không cần thêm bộ nhớ phụ (sắp xếp tại chỗ).

🐍 Ngày 31 - Python hằng ngày 365 ngày - Quản lý công việc với CSV

· 2 min read

🧠 Mục tiêu

Học cách đọc, ghi và cập nhật file CSV để lưu danh sách công việc (To-do List).


📂 File CSV mẫu

Task,Status
Chao co,Pending

🧪 Code Python hoàn chỉnh

import csv

FILENAME = "tasks.csv"

# Đọc dữ liệu từ file CSV
def read_tasks():
tasks = []
try:
with open(FILENAME, mode='r', newline='', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
tasks.append(row)
except FileNotFoundError:
print("⚠️ File chưa tồn tại. Tạo mới khi ghi.")
return tasks

# Ghi dữ liệu trở lại file CSV
def write_tasks(tasks):
with open(FILENAME, mode='w', newline='', encoding='utf-8') as file:
fieldnames = ['Task', 'Status']
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(tasks)

# Hiển thị danh sách công việc
def view_tasks(tasks):
print("\n📋 DANH SÁCH CÔNG VIỆC:")
for idx, task in enumerate(tasks, 1):
print(f"{idx}. {task['Task']} - {task['Status']}")

# Thêm công việc mới
def add_task(tasks):
task_name = input("📝 Nhập tên công việc: ")
tasks.append({"Task": task_name, "Status": "Pending"})
write_tasks(tasks)
print("✅ Đã thêm thành công!")

# Menu
def main():
while True:
print("\n===== MENU TO-DO LIST =====")
print("1. Xem danh sách")
print("2. Thêm công việc")
print("3. Thoát")
choice = input("👉 Nhập lựa chọn: ")

tasks = read_tasks()

if choice == '1':
view_tasks(tasks)
elif choice == '2':
add_task(tasks)
elif choice == '3':
print("👋 Tạm biệt!")
break
else:
print("⚠️ Lựa chọn không hợp lệ.")

if __name__ == "__main__":
main()

💾 Kết quả đầu ra

Giả sử bạn đã thêm 2 task mới:

Task,Status
Chao co,Pending
Hoc lap trinh,Pending
Di choi,Pending

🎯 Ngày 7 – SQL Server 365 ngày - ORDER BY – Sắp xếp kết quả truy vấn

· 2 min read

Chủ đề: ORDER BY – Sắp xếp kết quả truy vấn


✅ Mục tiêu học hôm nay

Học cách sử dụng ORDER BY để sắp xếp kết quả theo một hoặc nhiều cột, theo:

  • Tăng dần (ASC) – mặc định
  • Giảm dần (DESC)

📘 Câu lệnh mẫu

SELECT FirstName, LastName, HireDate
FROM Employees
ORDER BY HireDate ASC;

📝 Giải thích:

  • ORDER BY HireDate ASC sắp xếp theo thứ tự tăng dần ngày tuyển dụng.
  • ASC là mặc định, có thể bỏ qua.

🔄 Ví dụ nâng cao

SELECT FirstName, LastName, Salary
FROM Employees
ORDER BY Salary DESC, LastName ASC;

📝 Ý nghĩa:

  • Sắp xếp theo Salary giảm dần (cao → thấp)
  • Nếu trùng lương, sắp tiếp theo LastName tăng dần (A → Z)

🧪 Thực hành

Viết truy vấn SQL để:

  1. Sắp xếp theo FirstName tăng dần
  2. Sắp xếp theo Salary giảm dần
  3. Sắp xếp theo HireDate từ mới nhất đến cũ nhất

❓ Câu hỏi trắc nghiệm

Kết quả của truy vấn sau sẽ được sắp xếp như thế nào?

SELECT * FROM Employees
ORDER BY LastName DESC;

A) Theo họ nhân viên từ A → Z
B) Theo họ nhân viên từ Z → A
C) Theo EmployeeID tăng dần
D) Không sắp xếp gì cả

Đáp án: B

Phân Tích Phân Phối Giá Cổ Phiếu

· 2 min read

1. Giới Thiệu

Dữ liệu giao dịch dưới đây phản ánh sự biến động của giá cổ phiếu trong một khoảng thời gian cụ thể. Chúng ta sẽ phân tích xu hướng giá dựa trên các thông số như Open, High, Low, Close và Volume.

2. Dữ Liệu Giao Dịch

datetimeopenhighlowclosevolume
06/14/2024 19:55169.15169.16169.15169.160217
06/14/2024 19:50169.19169.19169.16169.16012
06/14/2024 19:45169.06169.06169.06169.0601
06/14/2024 19:40169.07169.07169.06169.06050
06/14/2024 19:35169.06169.07169.06169.07015
..................
06/14/2024 11:00168.04168.04167.81167.96045115
06/14/2024 10:55167.98168.06167.86168.06019597
06/14/2024 10:50167.80168.03167.73167.98213482
06/14/2024 10:45167.61167.80167.61167.77047085
06/14/2024 10:40167.38167.66167.23167.61037891

3. Nhận Định Xu Hướng

  • Biến động giá: Trong khoảng thời gian từ 10:40 đến 19:55, giá cổ phiếu dao động từ 167.38 đến 169.19.
  • Khối lượng giao dịch: Một số thời điểm có khối lượng giao dịch lớn, như 10:45 (47,085) và 11:00 (45,115), cho thấy sự quan tâm mạnh mẽ từ thị trường.
  • Mức giá cao nhất/thấp nhất: Giá cao nhất ghi nhận là 169.19, trong khi giá thấp nhất xuống đến 167.23.

4. Kết Luận

Dữ liệu trên cho thấy giá cổ phiếu có xu hướng dao động nhẹ trong ngày, với mức biến động trong khoảng 2 điểm. Việc quan sát kỹ các phiên giao dịch có khối lượng lớn có thể giúp dự đoán xu hướng tiếp theo của thị trường.

5. Chart

Đặt Lệnh Mua trên MetaTrader 5 bằng Python

· 2 min read

Giới thiệu

Bài viết này hướng dẫn cách sử dụng Python để đặt lệnh mua (BUY) trên MetaTrader 5 (MT5) bằng thư viện MetaTrader5.

Mã nguồn

# Hàm để đặt một lệnh mua
import MetaTrader5 as mt5
import math

# Kết nối tới MetaTrader 5
if not mt5.initialize(login=login, password=password, server=server):
print("Initialize() failed, error code =", mt5.last_error())
quit()
else:
symbol = 'EURUSD.sml'
lot = 0.01 # Số lượng lô mua

if not mt5.symbol_select(symbol, True):
print(f"Failed to select {symbol}, error code =", mt5.last_error())
quit()

symbol_info = mt5.symbol_info(symbol)
if symbol_info is None:
print(f"{symbol} not found")

point = symbol_info.point
price = mt5.symbol_info_tick(symbol).ask
deviation = 20 # Độ lệch giá cho phép

request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": lot,
"type": mt5.ORDER_TYPE_BUY,
"price": price,
"sl": price - 0.01, # Dừng lỗ (Stop Loss)
"tp": price + 0.02, # Chốt lời (Take Profit)
"deviation": deviation,
"magic": 234000,
"comment": "Autotrading K10",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_FOK,
}

result = mt5.order_send(request)
if result.retcode != mt5.TRADE_RETCODE_DONE:
print("Failed to send order :", result.retcode, result._asdict())
else:
print("Order placed BUY successfully!")
print(result)

# Đóng kết nối với MT5
mt5.shutdown()

Giải thích

  1. Khởi tạo kết nối với MT5

    • mt5.initialize(login, password, server): Kết nối với tài khoản giao dịch.
    • Nếu kết nối thất bại, chương trình thoát.
  2. Xác định tham số giao dịch

    • symbol: Cặp tiền tệ (EURUSD.sml).
    • lot: Khối lượng lệnh mua (0.01).
    • price: Giá mua theo giá ask.
    • sl, tp: Thiết lập dừng lỗ (Stop Loss) và chốt lời (Take Profit).
    • deviation: Độ lệch giá cho phép.
  3. Gửi lệnh mua

    • mt5.order_send(request): Gửi lệnh đến MT5.
    • Kiểm tra kết quả trả về.
    • Nếu lệnh được thực hiện thành công, in thông tin giao dịch.

Cải tiến

Xử lý lỗi khi không có dữ liệu giá

if price is None:
print("Không thể lấy giá hiện tại của", symbol)
mt5.shutdown()
quit()

Thêm tính năng kiểm tra số dư trước khi đặt lệnh

account_info = mt5.account_info()
if account_info is not None and account_info.balance < lot * price:
print("Số dư không đủ để đặt lệnh")
mt5.shutdown()
quit()

Ghi log giao dịch vào file CSV để theo dõi

import csv

with open("trade_log.csv", "a", newline="") as file:
writer = csv.writer(file)
writer.writerow([symbol, lot, price, "BUY", result.retcode])

📌 Tham khảo thêm: Tài liệu MetaTrader5 Python API

Gửi Lệnh Đặt Mua Cổ Phiếu qua API với requests

· 2 min read

Giới thiệu

Bài viết này hướng dẫn cách gửi lệnh đặt mua cổ phiếu bằng Python thông qua API sử dụng thư viện requests.

Mã nguồn

import requests

# Base URL for the API
base_url = "http://127.0.0.1:8000/newOrder" # Endpoint

# Parameters for the API request
params = {
"instrumentID": "VCB",
"market": "VN",
"buySell": "B",
"orderType": "ATO",
"price": 0,
"quantity": 100,
"account": "2654251",
"stopOrder": "false",
"stopPrice": 0,
"stopStep": 0,
"lossStep": 0,
"profitStep": 0,
"deviceId": "vEthernet (Default Switch):00-15-5D-C2-E5-EE|Wi-Fi:18-CC-18-C9-CB-6A",
"userAgent": "Python/3.11.6(Windows-10-10.0.19045-SP0); ssi-fctrading/2.4.2"
}

# Sending the GET request to the API
response = requests.get(base_url, params=params)

# Print the raw response
print(response)

# Handling the response
if response.status_code == 200:
data = response.json()["data"]
print(f"The stock order for account 2654251 is {data}")
else:
print(f"Error connecting to API: {response.status_code}")

Giải thích

  1. Import thư viện cần thiết

    • requests: Thư viện gửi HTTP request.
  2. Cấu hình API

    • base_url: Địa chỉ API xử lý lệnh đặt mua.
    • params: Các tham số truyền vào API, bao gồm mã chứng khoán, số lượng, loại lệnh, tài khoản giao dịch, v.v.
  3. Gửi yêu cầu API

    • requests.get(base_url, params=params): Gửi yêu cầu GET với các tham số đặt lệnh.
  4. Xử lý phản hồi

    • Nếu thành công (status_code == 200), lấy dữ liệu JSON và hiển thị kết quả.
    • Nếu thất bại, in thông báo lỗi với mã lỗi HTTP.

Cải tiến

Xử lý lỗi chi tiết hơn

try:
response = requests.get(base_url, params=params)
response.raise_for_status()
data = response.json().get("data", {})
print(f"Stock order response: {data}")
except requests.exceptions.RequestException as e:
print(f"API request error: {e}")

Chuyển đổi dữ liệu sang Pandas DataFrame

import pandas as pd

df = pd.DataFrame([data])
print(df.head())

Gửi lệnh bằng phương thức POST thay vì GET

response = requests.post(base_url, json=params)

📌 Tham khảo thêm: Tài liệu API đặt lệnh giao dịch

Hướng dẫn đăng nhập API Entrade bằng Python

· One min read

Bài viết này hướng dẫn cách sử dụng thư viện requests trong Python để đăng nhập vào API của Entrade và lấy access token.

Đăng nhập API

Dưới đây là đoạn mã sử dụng requests để gửi yêu cầu đăng nhập:

import requests

# URL cho endpoint đăng nhập
login_url = 'https://services.entrade.com.vn/dnse-auth-service/login'

# Thông tin đăng nhập (thay thế bằng thông tin thực tế của bạn)
username = 'your_email@example.com'
password = 'your_secure_password'

# Dữ liệu gửi kèm yêu cầu POST
login_data = {
'username': username,
'password': password
}

# Gửi yêu cầu POST đến API đăng nhập
response = requests.post(login_url, json=login_data)
token = ''

# Kiểm tra phản hồi
if response.status_code == 200:
# Lấy token từ phản hồi
token = response.json().get('token')
print('Đăng nhập thành công. Access token của bạn:', token)
else:
print('Đăng nhập thất bại. Mã lỗi:', response.status_code, response.text)