Đọc file text thông tin sinh viên

em có 1 file text nội dung là :

Nguyen Van A, 123, 6, 8
Nguyen Van B, 234, 6, 9

Em cần đọc nội dung ra và gán vào các biến sv[i].name, sv[i].id, sv[i].math, sv[i].phy
Code của e (chạy không đúng mong muốn):

class SinhVien(object):
  '''Lớp mô tả cho mọi sinh viên'''
   
  def __init__(self, name = "", id = 0, math = 0, phy = 0):
     if name is "":
     	self.none_copy_constructor()
     else:
     	self.copy_constructor(self)
  def copy_constructor(self,name, id, math, phy):
    self.name = name
    self.id = id
    self.math = math
    self.phy = phy

  def none_copy_constructor(self):
    self.name = ""
    self.id = 0
    self.math = 0
    self.phy = 0

  def show(self):
    print (self.name,'\t', self.id,'\t', self.math,'\t',self.phy)

sv1 = SinhVien()
file = open("SinhVien.txt","r")

#for line in file:
#for i in range (0,3):
sv1.name = file.read(30)
sv1.id = file.read(20)
sv1.math = file.read(6)
sv1.phy = file.read(5)
#    sv1.id = line.split()

file.close()
print (sv1.name,"\n",sv1.id,"\n",sv1.math,"\n",sv1.phy)

Cứ readline rồi split theo dấu phẩy (", "), đọc theo số kí tự cố định làm gì cho phức tạp.

4 Likes

đọc theo số kí tự là e làm để xem nó đọc có đúng ko thôi, chứ bài e hướng tới làm 1 list sinh viên làm sao kiểu đó được

file = open("SinhVien.txt","r")

#for line in file:
line = file.readline()
  

sv1.name = line.split(",",1)

file.close()
print(*sv1.name)
#print (sv1.name,"\n",sv1.id,"\n",sv1.math,"\n",sv1.phy)

Em thử làm như vậy thì biến sv1.name vẫn lưu cả dòng 1 (em muốn nó chỉ lưu Nguyen Van A thì làm thế nào) và khi in ra phải thêm dấu *

Lần đầu thấy con trỏ trong Python :smile:

Dữ liệu trả về 1 list thì bạn phải gọi index vào.

print(sv1_name[0])

Nhưng nếu bạn chia kết quả vào 4 biến thì

sv1.name, sv1.id, sv1.math, sv1.phy = line.split(', ')  # vì input đã có sẵn =))
2 Likes

ok e đã ra kết quả :))
p/s: cái dấu * e có muốn vậy đâu nhưng làm như vậy mới chịu in ra :slight_smile:

Vậy là bạn chưa học về indexing với list trong Python?

1 Like

vâng e đang tự học mà ko biết giáo trình nào cả.
cứ làm theo bài tập quản lý sinh viên để phát triển cần gì thì tìm cái đó thôi

Không nên học theo kiểu đó bạn nhé. Chắc bạn mới học từ C sang.

Bạn có thể học theo khoá này:

2 Likes

chào anh,
em học đến phần đọc file

Nguyen Van A, 123, 6, 8
Nguyen Van B, 234, 6, 9

thì khi đọc biến sẽ lưu dạng:

"Nguyen Van A, 123, 6, 8\n", "\n", "Nguyen Van B, 234, 6, 9\n"

gây khó khăn trong việc đếm số hàng hoặc lưu dạng list = list(file) theo dấu “\n”
Mong a giúp đỡ

Muốn lưu từng dòng của file vào list thì bạn gọi lines = file.readlines(). Lúc này thì

lines = ["Nguyen Van A, 123, 6, 8\n", "Nguyen Van B, 234, 6, 9\n"]
# theo như nội dung file mà bạn cung cấp thì sẽ không có phần tử '\n' đứng giữa

Sau đó với mỗi phần tử trong lines, bạn thực hiện xoá đi kí tự \n ở cuối và split như bình thường.

4 Likes

Em có file text dạng :
Nguyen Van A, 1, 2, 3
Nguyen Van B, 1, 3, 4
===========================
Rồi gán vào từng biến như những ví dụ trên nên khi chạy đến dòng thứ 3 sẽ báo lỗi không thể gán biến vậy làm thế nào để tránh lỗi đó ạ

class SinhVien(object):
  '''Lớp mô tả cho mọi sinh viên'''
   
  def __init__(self, name = "", id = 0, math = 0, phy = 0):
     if name is "":
     	self.none_copy_constructor()
     else:
     	self.copy_constructor(self)
  def copy_constructor(self,name, id, math, phy):
    self.name = name
    self.id = id
    self.math = math
    self.phy = phy

  def none_copy_constructor(self):
    self.name = ""
    self.id = 0
    self.math = 0
    self.phy = 0

  def show(self):
    print ('{:<20}'.format(self.name),'{:<10}'.format(self.id),'{:<10}'.format(self.math),'{:<15}'.format(self.phy))
    

file = open("SinhVien.txt","r")
count = 0
for x in file:
  if x.strip():
    count += 1

file.seek(0)
sv = [SinhVien for i in range(count)]
i = 0
line = list(file)
j = 0

"""def into ():
  sv[i].name, sv[i].id, sv[i].math, sv[i].phy = line[j].split(",")
  print("check")
  check = 1
  print(check)
  return check"""

print('{:<21}'.format('Name'),'{:<10}'.format('ID'),'{:<10}'.format('Math'),'{:<10}'.format('Phy'))
for i in range(count):
  sv[i] = SinhVien()
#  check = into() 
#  print(check)
#  if check == 1:
  sv[i].name, sv[i].id, sv[i].math, sv[i].phy = line[j].split(",")
  sv[i].show()
  i += 1
  j += 1
#    check = 0
#  else:
#    print("x")
#    break;
   
file.close()

"""file = open("SinhVien.txt","a+")
file.seek(0,1)
file.write("\n======================================")
file.close()"""
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?