Code đọc file python bị out of range

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ế ạ?

đ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é.

1 Like

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êm count là được. Và f là file-object chứ không phải list nên bạn phải dùng f.readlines() trong câu lệnh for.
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ùng line.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).

1 Like

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ểu str, list, dict không có method sethoten,…):

  • Thêm 1 list rỗng ở cuối list lớn (nếu linecount == 1): liststudent.append([])
  • Thêm vào phía cuối list nhỏ là thông tin của sinh viên: 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 đó
    • Nó sẽ tự thêm vào cho đến khi linecount == 7 và em sẽ đỡ phần gõ ifelif.

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òn dict 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 :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?