Câu 1json.dumps({"name": "café"}, ensure_ascii=False) cho ra kết quả nào?
json và csv — I/O cho dữ liệu có cấu trúc
Bài viết này là một phần của Khóa học Python, giúp bạn thành thạo từ đầu những kỹ năng cần thiết để sử dụng Python, từ cơ bản đến nâng cao.
Học chuyển đổi hai chiều với json.dumps/loads và ensure_ascii, đọc/ghi theo vị trí với csv.writer/reader, và đọc/ghi theo tên cột với DictWriter/DictReader qua dữ liệu Titanic.
Bài này nói về I/O cho hai định dạng dữ liệu có cấu trúc thường gặp — json, hay được web API dùng, và csv, mở gọn gàng trong phần mềm bảng tính.
json — Chuyển đổi hai chiều giữa object Python và chuỗi JSON
JSON (JavaScript Object Notation) là định dạng văn bản nhẹ biểu diễn cấu trúc chỉ bằng "cặp khóa/giá trị" và "list có thứ tự", được dùng làm tiêu chuẩn cho response web API và file cấu hình. Module json của Python chuyển đổi dict, list, chuỗi, số, bool và None sang và từ JSON.
Chỉ cần nhớ hai hàm cơ bản. json.dumps(object) chuyển Python → chuỗi JSON, và json.loads(string) chuyển chuỗi JSON → Python. Chữ s ở cuối là viết tắt của string — phân biệt với dump / load, vốn làm việc trực tiếp với file.
s (dump / load) làm việc trực tiếp với đối tượng file.| Hàm | Vai trò | Ghi chú |
|---|---|---|
| json.dumps(obj) | Python → chuỗi JSON | trả về str |
| json.loads(text) | chuỗi JSON → Python | trả về dict / list / v.v. |
| json.dump(obj, file) | Python → ghi vào file | truyền f từ open() |
| json.load(file) | file → Python | truyền f từ open() |
| indent=N | in đẹp với thụt lề N space | cho người đọc |
| ensure_ascii=False | xuất ký tự non-ASCII nguyên dạng | mặc định escape chúng |
ensure_ascii mặc định là True
Mặc định, json.dumps({"name": "café"}) xuất '{"name": "caf\u00e9"}' — ký tự non-ASCII bị escape thành \u. Về kỹ thuật vẫn hợp lệ, nhưng khó đọc cho người và làm phình kích thước file, nên với dữ liệu chứa ký tự non-ASCII (dấu, emoji, CJK, v.v.), hãy tạo thói quen truyền ensure_ascii=False.
Cơ bản về csv — Xử lý dòng với reader và writer
CSV (Comma-Separated Values) là định dạng văn bản thuần trong đó một dòng phân tách bằng dấu phẩy bằng một bản ghi, và vì phần mềm bảng tính như Excel mở được trực tiếp, nó xuất hiện khắp nơi trong workflow nghiệp vụ. Module csv của Python cung cấp các hàm để đọc và ghi định dạng này theo từng dòng.
Cơ bản gồm csv.writer(file) và csv.reader(file): cái trước ghi một list giá trị thành một dòng, cái sau đọc CSV từng dòng một thành một list giá trị. Hai điểm cần lưu ý: thứ nhất, mọi thứ đọc về đều là chuỗi — nếu cần số nguyên, hãy tự chuyển đổi bằng int(). Thứ hai, luôn truyền newline='' cho open(...) để module csv tự quản lý ký tự xuống dòng.
Luôn truyền newline='' cho open
Module csv tự quản lý ký tự xuống dòng, nên bạn cần truyền newline='' kiểu open("x.csv", "w", newline=''). Bỏ qua thì có thể dẫn đến CSV chứa dòng trống trên Windows — một lỗi điển hình được tài liệu Python chính thức nhắc đến.
DictWriter và DictReader — Đọc và ghi theo tên cột
csv.writer / reader ở phần trước hoạt động theo vị trí, nên thêm cột hoặc đổi thứ tự buộc bạn phải sửa lại mọi truy cập row[0] / row[1]. DictWriter / DictReader là phiên bản đọc và ghi theo tên cột (header) — bạn có thể ghi một list các dict thẳng vào CSV và đọc lại thành một list các dict.
Dữ liệu thực tế phần lớn là CSV có dòng header, nên trong dự án thực tế bạn sẽ dùng các hàm này nhiều hơn hẳn.
fieldnames. DictReader làm chiều ngược lại — đọc CSV có dòng header thành list các dict, để bạn truy cập giá trị theo tên cột kiểu row["name"].Ví dụ thực tế: Tổng hợp titanic.csv
Đến giờ ta đã tạo các tập dữ liệu nhỏ trong code và ghi chúng ra. Hãy kết thúc bằng việc đọc một tập dữ liệu thực và tổng hợp. Đối tượng là tập dữ liệu Titanic nổi tiếng trên Kaggle (891 dòng / 12 cột), với các cột như PassengerId / Survived (0 = chết, 1 = sống sót) / Pclass (hạng cabin) / Name / Sex / Age / Fare.
python_console của bài thực hành nạp sẵn CSV bên ngoài vào hệ thống file ảo (VFS) trong trình duyệt qua fileUrls, nên code của bạn chỉ cần gọi open("titanic.csv"). Ta sẽ viết cùng một bài tập với cả csv.reader (theo vị trí) và csv.DictReader (theo tên cột).
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Kiểu của giá trị trả về khi đọc dòng bằng csv.reader là gì?
Câu 3Cái nào hợp nhất để đọc một CSV có dòng header thành list các dict?