Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

  1. Trang chủ
  2. Blog
  3. Phát triển phần mềm

Phát triển phần mềm

Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

Hầu hết mọi tập lệnh thực đều đọc hoặc ghi một tập tin. Tìm hiểu cách an toàn để mở tệp, chọn chế độ phù hợp, xử lý CSV và JSON, làm việc với các đường dẫn bằng pathlib và tránh lỗi xóa sạch dữ liệu của bạn.

Đọc 9 phút
Xử lý tệp Python: đọc, ghi, CSV, JSON và pathlib kèm theo các ví dụ

Điểm chính

  • Luôn mở tệp có khối with để chúng tự động đóng.
  • Chế độ "w" xóa một tập tin hiện có. Sử dụng "a" để thêm vào một hoặc "x" để từ chối ghi đè.
  • Lặp lại đối tượng tệp để đọc các tệp lớn mà không cần tải mọi thứ vào bộ nhớ.
  • Vượt qua encoding="utf-8" một cách rõ ràng và ưu tiên pathlib để xây dựng đường dẫn.

Nhật ký, báo cáo, cấu hình, xuất: sớm hay muộn, mọi tập lệnh đều chạm vào hệ thống tệp. Việc xử lý tệp Python bắt đầu rất đơn giản nhưng có một số chi tiết quyết định xem mã của bạn có đáng tin cậy hay lặng lẽ phá hủy dữ liệu.

Hướng dẫn này bao gồm các tệp văn bản, CSV, JSON, dữ liệu nhị phân và đường dẫn, tập trung vào các thói quen an toàn. Chúng tôi đã chạy các ví dụ này trên Python 3.13 trong một thư mục tạm thời và kết quả hiển thị là từ lần chạy đó.

Mở tệp bằng open() và với

Hàm open() tích hợp trả về một đối tượng tệp. Sử dụng nó bên trong khối with:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("first line\n")
    file.write("second line\n")

print(file.closed)

# True

Khi khối kết thúc, Python sẽ đóng tệp, ngay cả khi xảy ra lỗi bên trong nó. Nếu không có with, bạn phải tự gọi close() và một ngoại lệ có thể bỏ qua dòng đó. Sử dụng một tập tin sau khi nó đã đóng sẽ gây ra lỗi:

file.read()

# ValueError: I/O operation on closed file.

Chế độ tập tin

Đối số thứ hai của open() cho biết bạn dự định làm gì:

Chế độ Ý nghĩa Nếu tập tin tồn tại Nếu nó không
r Đọc (mặc định) Mở nó ra Lỗi
w Viết Xóa nó trước tiên Tạo nó
một Nối thêm Thêm vào cuối Tạo nó
x Tạo độc quyền Lỗi Tạo nó
r+ Đọc và viết Mở nó ra Lỗi

Thêm b cho dữ liệu nhị phân, như trong "rb" hoặc "wb". Văn bản là mặc định và nó cũng có thể được viết rõ ràng dưới dạng t.

Viết và nối thêm

write() không thêm dấu ngắt dòng, vì vậy hãy thêm \n vào. Việc bổ sung sẽ giữ lại những gì đã có:

with open("notes.txt", "a", encoding="utf-8") as file:
    file.write("third line\n")

So sánh điều đó với chế độ "w", thay thế ba dòng của chúng tôi bằng một dòng, không có cảnh báo nào cả:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("replaced\n")

# notes.txt now contains only: replaced

Khi bạn không được ghi đè lên thứ gì đó, hãy sử dụng "x". Nó đã nâng cao FileExistsError trong thử nghiệm của chúng tôi vì notes.txt đã tồn tại.

Đọc một tập tin

Có một số cách để đọc và lựa chọn đúng tùy thuộc vào kích thước của tệp:

Cách tiếp cận Trả lại Tốt nhất cho
file.read() Một chuỗi với mọi thứ Tệp nhỏ
file.readline() Dòng tiếp theo Đọc tiêu đề
file.readlines() Danh sách các dòng Các tệp nhỏ bạn cần làm danh sách
cho dòng trong tập tin Mỗi dòng một lần Mọi kích thước, đặc biệt là các tệp lớn
with open("notes.txt", encoding="utf-8") as file:
    print(repr(file.read()))

# 'first line\nsecond line\n'

with open("notes.txt", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

# first line
# second line
# third line

Lưu ý các ký tự \n được giữ trong chuỗi thô. strip() loại bỏ chúng. Đối tượng tệp cũng ghi nhớ vị trí của nó, vì vậy việc đọc tiếp tục ở nơi nó đã dừng lại:

with open("notes.txt", encoding="utf-8") as file:
    print(file.readline().strip())
    print(file.readlines())

# first line
# ['second line\n', 'third line\n']

Lặp lại tệp là kỹ thuật chính cho các bản ghi lớn và xuất khẩu. Nó đọc từng dòng một, do đó, một tệp nhiều gigabyte không cần phải vừa với bộ nhớ.

Xử lý lỗi tập tin

Các tệp có thể bị thiếu, bị khóa hoặc không thể đọc được, vì vậy hãy lên kế hoạch cho việc đó:

try:
    with open("missing.txt", encoding="utf-8") as file:
        data = file.read()
except FileNotFoundError as error:
    print(error)

# [Errno 2] No such file or directory: 'missing.txt'
Ngoại lệ Nguyên nhân điển hình
TệpKhông Tìm thấyLỗi Đường dẫn không tồn tại
Tệp tồn tạiLỗi Chế độ x trên một tệp hiện có
QuyềnLỗi Không được phép hoặc bị khóa trên Windows
IsADirectoryLỗi Đường dẫn là một thư mục
UnicodeGiải MãLỗi Mã hóa sai đã được sử dụng

Hãy thử mở tệp và phát hiện lỗi thay vì kiểm tra trước bằng exists(), vì tệp có thể biến mất giữa quá trình kiểm tra và mở. Hướng dẫn của chúng tôi về Xử lý ngoại lệ Python đề cập đến phương pháp này.

Tệp CSV

Không tự phân chia dòng CSV bằng dấu phẩy vì các giá trị được trích dẫn có thể chứa dấu phẩy. Mô-đun csv tiêu chuẩn xử lý các quy tắc đó. DictWriter và DictReader là những lựa chọn dễ đọc nhất:

import csv

with open("orders.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["id", "customer", "total"])
    writer.writeheader()
    writer.writerow({"id": 1, "customer": "Asha", "total": 1200})
    writer.writerow({"id": 2, "customer": "Ben", "total": 300})

with open("orders.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))

print(rows[0])
print(sum(int(r["total"]) for r in rows))

# {'id': '1', 'customer': 'Asha', 'total': '1200'}
# 1500

Hai chi tiết quan trọng. Chuyển newline="" khi mở tệp CSV, như tài liệu khuyến nghị, để ngăn các hàng trống trên Windows. Và mọi giá trị đều trả về dưới dạng chuỗi, số chẵn, đó là lý do tại sao chúng ta cần int() trong tổng. Đối với công việc xử lý dữ liệu nặng, thư viện như pandas có thể phù hợp hơn.

tệp JSON

JSON là định dạng thông thường cho dữ liệu cấu hình và API. Nó ánh xạ gọn gàng vào từ điển Python và liệt kê:

import json

config = {"debug": True, "retries": 3, "hosts": ["a", "b"]}

with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2)

with open("config.json", encoding="utf-8") as file:
    print(json.load(file)["retries"])

# 3

Hãy nhớ cách đặt tên: dump và load hoạt động với các tệp, trong khi dumps và loads hoạt động với các chuỗi. Các loại như ngày tháng không thể được lưu trữ trực tiếp, vì vậy trước tiên bạn cần chuyển đổi chúng thành chuỗi.

Làm việc với các đường dẫn bằng pathlib

Việc dán các đường dẫn lại với nhau bằng các chuỗi ngắt trên các hệ điều hành. Mô-đun pathlib tiêu chuẩn xử lý các dấu phân cách cho bạn và cung cấp các phím tắt tiện dụng:

from pathlib import Path

path = Path("data") / "reports" / "summary.txt"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("all good\n", encoding="utf-8")

print(path.read_text(encoding="utf-8").strip())   # all good
print(path.suffix, path.stem, path.exists())      # .txt summary True
print(sorted(p.name for p in Path(".").glob("*.csv")))
# ['orders.csv']
Nhiệm vụ đường dẫn
Tham gia đường dẫn Đường dẫn("a") / "b.txt"
Tạo thư mục path.mkdir(parents=True, tồn_ok=True)
Đọc hoặc viết toàn bộ văn bản read_text(), write_text()
Tìm tập tin glob("*.csv"), rglob("*.py")
Xóa một tập tin path.unlink()
Lấy thư mục của tập lệnh hiện tại Path(__file__).parent

Điều cuối cùng đó giải quyết được cơn đau đầu thông thường. Các đường dẫn tương đối giải quyết từ nơi bạn chạy tập lệnh chứ không phải từ nơi tập lệnh tồn tại, do đó việc xây dựng các đường dẫn từ Path(__file__).parent sẽ tránh được nhiều điều bất ngờ “không tìm thấy tệp”.

Tệp nhị phân

Hình ảnh, tệp PDF và tệp ZIP không phải là văn bản. Mở chúng bằng b và bạn đọc và viết bytes mà không cần mã hóa:

with open("pixel.bin", "wb") as file:
    file.write(bytes([255, 0, 128]))

with open("pixel.bin", "rb") as file:
    print(file.read())

# b'\xff\x00\x80'

Viết an toàn hơn

Nếu một chương trình gặp sự cố khi đang ghi một tệp quan trọng, bạn có thể nhận được kết quả bị lỗi. Một cách khắc phục phổ biến là ghi vào một tệp tạm thời trước, sau đó hoán đổi nó vào vị trí:

temp = Path("settings.tmp")
temp.write_text("new", encoding="utf-8")
temp.replace("settings.txt")

print(Path("settings.txt").read_text(), temp.exists())

# new False

replace() ghi đè đích. Trên cùng một hệ thống tệp, việc đổi tên nói chung là nguyên tử, vì vậy người đọc sẽ thấy tệp cũ hoặc tệp mới thay vì hỗn hợp được viết một nửa.

Mẹo: Không bao giờ xây dựng đường dẫn tệp trực tiếp từ thông tin đầu vào của người dùng mà không kiểm tra chúng. Giá trị như ../../secrets.txt có thể tiếp cận các tệp bên ngoài thư mục dự định của bạn. Điều này được biết đến như một lỗ hổng truyền tải đường dẫn.

Một ví dụ thực tế: tóm tắt nhật ký

Kịch bản ngắn này kết hợp nhiều ý tưởng lại với nhau. Nó đọc nhật ký từng dòng một, do đó kích thước của nó không thành vấn đề, đếm từng cấp độ bằng cách sử dụng Counter và ghi tóm tắt vào một tệp mới:

from collections import Counter

counts = Counter()
with open("app.log", encoding="utf-8") as file:
    for line in file:
        counts[line.split()[0]] += 1

with open("summary.txt", "w", encoding="utf-8") as out:
    for level, total in counts.most_common():
        out.write(f"{level}: {total}\n")

# summary.txt
# ERROR: 2
# INFO: 2
# WARN: 1

Nhật ký mẫu của chúng tôi có năm dòng. Một dòng trống sẽ ngắt line.split()[0], vì vậy các tập lệnh thực sự nên bỏ qua các dòng trống trước tiên.

Những lỗi thường gặp

  • Sử dụng "w" khi ý bạn là "a". Dữ liệu hiện có của bạn sẽ biến mất ngay lập tức khi mở, ngay cả khi bạn không bao giờ viết bất cứ điều gì.
  • Bỏ qua mã hóa. Giá trị mặc định thay đổi tùy theo hệ thống, do đó, tập lệnh hoạt động trên Linux có thể bị lỗi trên Windows với văn bản có dấu hoặc biểu tượng cảm xúc.
  • Gọi read() trên các tệp lớn. Điều này có thể làm cạn kiệt bộ nhớ, vì vậy hãy lặp lại các dòng.
  • Quên int() trên các giá trị CSV. "10" + "20" cho "1020".
  • Bỏ qua newline="" cho CSV. Bạn có thể nhận được các hàng trống không mong muốn trên Windows.
  • Không kiểm tra mã tệp. Sử dụng bản cố định tmp_path của pytest để kiểm tra không bao giờ chạm vào tệp thực. Xem hướng dẫn pytest của chúng tôi.

Lời kết

Một số thói quen bao gồm hầu hết mọi thứ ở đây: sử dụng with, đặt mã hóa, suy nghĩ kỹ về "w" và để csv, json và pathlib thực hiện những phần khó. Để thực hành, hãy viết một tập lệnh nhỏ đọc CSV, tính tổng một cột và lưu bản tóm tắt JSON vào một thư mục mới.

Câu hỏi thường gặp

Làm cách nào để đọc từng dòng tệp trong Python?

Mở nó trong một khối with và lặp qua đối tượng tệp. Cái này đọc từng dòng một, vì vậy nó hoạt động tốt ngay cả đối với những tệp rất lớn.

Sự khác biệt giữa w và chế độ là gì?

Chế độ w xóa mọi nội dung hiện có ngay khi tệp mở ra. Chế độ a giữ nội dung hiện có và thêm dữ liệu mới vào cuối tệp.

Tại sao tôi nên sử dụng with để mở một tập tin?

Câu lệnh with sẽ tự động đóng tệp khi khối kết thúc, ngay cả khi xảy ra lỗi. Điều này ngăn ngừa rò rỉ và giúp đảm bảo dữ liệu được ghi.

Làm cách nào để kiểm tra xem tệp có tồn tại trong Python không?

Sử dụng Path(“name.txt”).exists() từ pathlib. Nếu bạn dự định mở nó ngay sau đó, việc phát hiện FileNotFoundError thường đáng tin cậy hơn việc kiểm tra trước.

Tại sao CSV của tôi có dòng trống trên Windows?

Có thể bạn đã mở tệp mà không có dòng mới=””. Mô-đun csv tự quản lý các kết thúc dòng, vì vậy hãy chuyển đối số đó để tránh các hàng trống thừa.

Tiếp tục học hỏi

Làm việc với Stack Quora

Cần trợ giúp về kiểm tra, WordPress hoặc SEO?

Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.

Tiếp tục đọc

Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại

Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.

Trí tuệ nhân tạo

Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó

Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …

Đọc bài viết →
DevOps

Giải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng

Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…

Đọc bài viết →
Phát triển phần mềm

Giải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429

Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …

Đọc bài viết →
Tự động hóa kiểm thử

Chế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối

Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…

Đọc bài viết →
Kiểm thử phần mềm

Giải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%

Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

DELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại

DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ

Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…

Đọc bài viết →
Phát triển phần mềm

Giao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch

Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …

Đọc bài viết →
Phát triển phần mềm

Giải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng

Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…

Đọc bài viết →
Phát triển phần mềm

Hàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng

Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …

Đọc bài viết →
Trí tuệ nhân tạo

Đại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy

Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …

Đọc bài viết →
DevOps

Giám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết

Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…

Đọc bài viết →
DevOps

Docker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách

Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …

Đọc bài viết →
Tự động hóa kiểm thử

TDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each

TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế

Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Câu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp

TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…

Đọc bài viết →
Phát triển phần mềm

JWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động

JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…

Đọc bài viết →
Phát triển phần mềm

Giải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ

Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…

Đọc bài viết →
Phát triển phần mềm

Giải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế

Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …

Đọc bài viết →
Trí tuệ nhân tạo

Nhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản

nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…

Đọc bài viết →
DevOps

Triển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn

Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…

Đọc bài viết →
Tự động hóa kiểm thử

Kiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn

Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6

Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…

Đọc bài viết →
Kiểm thử phần mềm

Trường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp

Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…

Đọc bài viết →
Cơ sở dữ liệu & SQL

SQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra

SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…

Đọc bài viết →
Phát triển phần mềm

Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…

Đọc bài viết →
Phát triển phần mềm

Git merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào

Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.

Đọc bài viết →
Phát triển phần mềm

List comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh

List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.

Đọc bài viết →