Quy ước tệp trước khi đọc
Tạo tệp `Data.inp` UTF-8 trong cùng thư mục với chương trình, ví dụ:
```text
Táo, 1200
Mơ, 900
Lê, 1000
```
Mỗi dòng hợp lệ có đúng một dấu phẩy phân cách; tên không rỗng và không chứa dấu phẩy, phần sau là số doanh số. Hàm đọc thêm tên vào dãy `P` và số vào dãy `S` ở cùng chỉ số: `P[0]="Táo"` đi cùng `S[0]=1200.0`. Đây là dữ liệu giả để tập cách đọc tệp, không phải giá bán thật.
Một hàm có kết quả và lỗi rõ ràng
```python
def doc_du_lieu(ten_tep):
P, S = [], []
with open(ten_tep, encoding="utf-8") as f:
for dong in f:
dong = dong.strip()
if not dong:
continue
phan = dong.split(",")
if len(phan) != 2 or not phan[0].strip():
raise ValueError("Dòng phải có tên và doanh số")
P.append(phan[0].strip())
S.append(float(phan[1].strip()))
return P, S
P, S = doc_du_lieu("Data.inp")
print(P, S)
```
Với tệp mẫu, kết quả là `['Táo', 'Mơ', 'Lê'] [1200.0, 900.0, 1000.0]`. `with open` đóng tệp sau khi đọc. Nếu thiếu dấu phẩy, tên rỗng hoặc phần doanh số không đổi được thành số, chương trình báo lỗi thay vì tạo hai dãy lệch nhau. Chương trình báo cáo ba cao/ba thấp sẽ cần **ít nhất sáu mặt hàng**; ba dòng ở đây chỉ dùng để kiểm mô-đun đọc.
Bài luyện
Với dòng tệp `"Mơ, 900"`, hai giá trị tương ứng cần lưu là gì?
Tên ở trước dấu phẩy; số ở sau được đổi sang float.
Hai phần bị đảo.
Cần cả doanh số.
900 là dữ liệu doanh số, không là chỉ số.
Lời giải
Tách ở dấu phẩy cho tên Mơ và chữ 900; float đổi chữ 900 thành số 900.0.
Bài luyện
Điều gì giữ cho `P[i]` và `S[i]` mô tả cùng một mặt hàng?
Hai phép append cùng lượt tạo hai giá trị cùng chỉ số.
Sắp riêng P sẽ phá cặp tương ứng.
Xóa dữ liệu không giữ cặp.
Báo cáo cần nhiều mặt hàng.
Lời giải
Mỗi dòng được tách rồi thêm một tên vào P và một số vào S; vì cùng lượt, hai giá trị có cùng chỉ số.
Bài luyện
Với dòng `"Cam 1500"` thiếu dấu phẩy, hàm `doc_du_lieu` làm gì?
Quy ước yêu cầu dấu phẩy.
Hàm chỉ bỏ dòng trống.
split cho một phần nên không đạt len(phan)==2.
Hàm đọc không ghi báo cáo.
Lời giải
Dòng không có dấu phẩy tách thành một phần; kiểm tra len(phan) != 2 dẫn đến ValueError.
Đang học