30/09/2018, 23:55
[Hỏi về đọc file trong python ..]
em muốn đọc 1 file lưu dữ liệu vào 1 list object trong python, object có 7 thuộc tính nên em dùng câu lệnh if và elif để chia từng line mà lấy từng line 1 . cụ thể code như sau
def readfile(self):
f= open('input.txt','r')
linecount = 1
count = 0
for line in f:
if linecount==1:
self.liststudent[count].sethoten(line)
elif linecount==2:
self.liststudent[count].setsbd(line)
elif linecount == 3:
self.liststudent[count].setdiachi(line)
elif linecount == 4:
self.liststudent[count].setgioitinh(line)
elif linecount == 5:
self.liststudent[count].setdtoan(line)
elif linecount == 6:
self.liststudent[count].setdhoa(line)
elif linecount == 7:
self.liststudent[count].setdly(line)
linecount+=1
if linecount&7==1 and linecount>1:
linecount=1
count+=1
vì sao lại bị lỗi out of range thế ạ?
Bài liên quan
đoạn code linecount+=1 là ở ngoài câu lệnh elif cuối cùng , nó ngang với các câu lệnh if và elif
Bạn học cách post code dùng markdown tại đây. Do python quan trọng phần “indentation” nên bạn post “chay” như vậy rất khó đọc bạn nhé.
Kiểu list khác với kiểu dictionary nên bạn phải dùng
list.append()
chứ không phải cứ tăng thêmcount
là được. Vàf
là file-object chứ không phải list nên bạn phải dùngf.readlines()
trong câu lệnhfor
.Mình góp ý với cái file dữ liệu của bạn, bạn định dạng như thế nào mới quan trọng và dễ phân tích.
Ví dụ:
ho_ten:SBD:dia_chi:gioi_tinh:dtoan:dhoa:dly
, mỗi người đều giống nhau như thế nên bạn có thể dùngline.split(':')
để được 1 cái list gồm 7 đối tượng và bạn gán nó theo thứ tự là được (nhớ bỏ đi ký tự newline).em để mỗi thuộc tính của 1 object là 1 hàng, object có 7 nên cứ 7 hàng thì chuyển 1 object.
còn về hàm in, in theo kiểu dict vì khi in bt nó lại ra là ___main gì gì đấy , nó vẫn chạy nhưng lại không in ra đc
Như em nói thì cũng được (vì ngoài mấy bài tập blablabla ra thì không có dạng dữ liệu như vậy, nhìn hơi xấu). Em nên tự tạo cho mình 1 dạng dữ liệu khác hoặc em có thể tham khảo định dạng dữ liệu trong các file cấu hình ví dụ như ini, json, xml,… Cái đó mới thực tế.
Cách em đọc file thì anh không ý kiến, anh chỉ ý kiến về cú pháp thôi. Khi em vừa sử dụng biến gì thì em nên tập khởi tạo (cho quen, tuy đôi lúc hơi dư thừa). Ví dụ: biến
liststudent
sẽ dùng list lồng trong list (nhưng hình như em làm object trong list, bởi vì kiểustr
,list
,dict
không có methodsethoten
,…):linecount == 1
):liststudent.append([])
liststudent[count].append(line.strip('\n'))
count
: vị trí hiện tại của list lớn.line
: nội dung tại dòng đólinecount == 7
và em sẽ đỡ phần gõif
vàelif
.Lỗi
IndexError: list index out of range
xảy ra khi số chỉ mục lớn quá chiều dài của list (hay tuple,…), còndict
thì tự nhiên, không xảy ra lỗi này (với điều kiện là em gán cho nó giá trị chứ không phải gọi - vì em gọi phần tử chưa được không tồn tại thì có lỗi thôi).ok anh :D.
em đã sửa đc. cảm ơn anh