Cần giúp đỡ về truy xuất tập tin

Em mới học Python và đang đọc đến phần truy xuất dữ liệu từ tập tin. Hiện tại em đang muốn tìm tất các từ nào đó trong tập tin thì em sử dụng vòng lặp for và count ra. Nhưng nếu em thêm đoạn read file ra (inp = fhand.read()) để in ra toàn bộ nội dung file thì nó sẽ không chạy vào vòng lặp của em nữa. Ai có thể giải thích cho em hiểu được không ạ? Em xin cám ơn mọi người.

fname = raw_input('Enter the name file:')

try:
    fhand = open(fname)
except:
    print 'File cannot be opened.',fname
    exit()

inp = fhand.read()
count = 0
for line in fhand:
    if line.startswith('From:'):  
        count = count + 1

print 'there were',count,'subject lines in',fname
print inp

Hàm read() của file object sẽ đọc hết tất cả những gì trong file và con trỏ bây giờ sẽ nằm cuối file. Vì vậy, khi bạn muốn đọc nữa thì còn gì đâu để đọc :joy: chuyện là thế đó.
Mình thấy vòng lặp nên sửa thành for line in inp.split('\n'): thì kết quả cũng tương tự thôi.
P/s: Nếu có lỗi gì thì cứ báo lại, mình sửa tiếp nha.

1 Like

Thank bạn,

Nếu không phiền bạn có thể giải thích cho mình sao mà thêm .split(’\n’) thì nó chạy ko? vì lúc mình thử line in inp thì nó cũng ko hoạt động.

Vì biến inp lúc này là kiểu chuỗi str() (cách kiểm tra kiểu: type(biến)) và kiểu chuỗi có method split(sep [, maxsplit]) dùng để tách chuỗi (bởi sep) thành 1 list (với số lượng tối đa là maxsplit, mặc định maxsplit là không giới hạn).
Khi dùng inp.split('\n') thì nó sẽ tách nội dung file thành các dòng (gặp ký tự ‘\n’ là tách ra - và ký tự ‘\n’ cũng không được ghi vào list). Bạn cũng có thể dùng fhand.readlines() và nó đọc theo dòng và trả về 1 list (ký tự ‘\n’ không bị loại bỏ).

  • Ví dụ mình có 1 file test.txt có nội dung:

Adele - Hello
Hello from the other side.

  • Dùng split():
# repr là hàm để in ra nội dung nguyên bản (có cả '\n')
# in nội dung file đã đọc:
print repr(open('test.txt').read())

# dùng split xem sao:
print repr(open('test.txt').read().split('\n'))
  • Output:

'Adele - Hello\nHello from the other side'
['Adele - Hello', 'Hello from the other side']

  • Dùng readlines():
# dùng readlines:
print repr(open('test.txt').readlines())
  • Output:

['Adele - Hello\n', 'Hello from the other side']

  • Đó là sự khác biệt :smiley: (để ý ‘\n’ ở sau ‘Hello’ nhé).

Bạn tham khảo: python -c "help(str.split)" hoặc python -c "help(str)"

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