30/09/2018, 22:21

Close file là gì?

Em thực sự không hiểu close là gì và để làm gì cả? Ai có thể giải thích dễ hiểu giúp em được không ạ?

Người bí ẩn viết 00:32 ngày 01/10/2018

Mình không bên Python nhưng theo mình hiểu, close file lại để khi có gọi hoặc sử dụng file khác nó không bị lỗi , thế thôi

Hưng viết 00:34 ngày 01/10/2018

Trường hợp này: Txt=open(tenfile).read() thì nó không đóng được, có sao không ạ?

Hưng viết 00:32 ngày 01/10/2018

Txt.close() báo lỗi là kiểu như là không thể đóng được kiểu ‘read’ object

viết 00:32 ngày 01/10/2018

Txt.close() lỗi là vì Txt không phải là một đối tượng file (file object) mà chỉ là đối tượng bình thường. Txt=open(tenfile).read() được ngầm hiểu là đọc nội dung của file object open(tenfile) rồi lưu vào object Txt. Để rõ ràng khi mới lập trình bạn tránh viết tắt kiểu này, bởi sau này khi nhìn lại có khi bạn không rõ ý nghĩa câu lệnh như thế nào, để làm gì, nên là:

file_obj=open(tenfile)
Txt=file_obj.read()
file_obj.close()
Hưng viết 00:31 ngày 01/10/2018

Em học trên learnpythonthehardway thì có nói là close file cũng như File -> Save nghĩ mãi mà cũng chả hiểu close nó là cái gì? Em khó mà tập trung được nên mấy cái như vậy em chả nghỉ được gì cả, chỉ thêm nản thôi! Mong giải thích hộ em ạ!

Hưng viết 00:32 ngày 01/10/2018

Nếu vậy muốn đóng file thì chỉ cần đóng cái nào được gán = open(tên của file) thôi đúng không ạ?
> from sys import argv
> from os.path import exists
script, from_file, to_file = argv
print “Copying from %s to %s” % (from_file, to_file)
input = open(filename)
indata = input.read()
print “The input file is %d bytes long” % len(indata)
print “Does the output file exist? %r” % exists(to_file)
print “Ready, hit RETURN to continue, CTRL-C to abort.”
raw_input()

    out_file = open(to_file, 'w')
    out_file.write(indata)

    print "Alright, all done."
  `out_file.close()`
`  input.close()`

Như trong code trên thì em chỉ cần đóng out_file và input_file thôi đúng không ạ?Còn cái indata thì sao ạ?

Hưng viết 00:27 ngày 01/10/2018

Nếu như Txt với indata ở code trên chỉ là object bình thường thôi nên không đóng cũng chả sao đúng không ạ?

Chế Tiệp Chân Khoa viết 00:23 ngày 01/10/2018

open('file.txt') mở một connection từ chương trình của bạn đến file trên đĩa
khi không đưa tham số mode (ví dụ như open('file.txt', 'w') thì mode = ‘w’ -> write, chế độ ghi ) thì mặc định là read. nhưng ở đây để đầy đủ hơn mình sẽ dùng chế độ ghi:

f = open('file.txt', 'r') # mở connection từ chương trình đến file
s = f.read() # đọc toàn bộ file và lưu vào s
f.write('fuck you') # ghi chuỗi vào buffer (bộ nhớ đệm), lúc nào file trên đĩa ko đổi
f.push() # save file
f.close() # save and close (tức f.push() sau đó close connection)

Nếu vậy muốn đóng file thì chỉ cần đóng cái nào được gán = open(tên của file) thôi đúng không ạ?

đúng rồi, vì những cái không lưu vào biến thì sẽ bị garbage collection ngay tức khắc sau khi dùng xong (mà lúc đó cũng không close được vì biết close từ đâu)
những cái lưu vào biến thì phải close, vì nếu để đó sẽ tốn tài nguyên máy

vũ xuân quân viết 00:24 ngày 01/10/2018

Tại sao lại có close file ? Giải thích:
có 2 tình huống.

  • Tình huống 1: người dùng tạo file txt. VD: dùng phần mềm notepad++ để tạo file txt.
    Khi tạo mới file txt thì báo cho hệ điều hành biết là đang mở 1 file.
    Nhập nội dung vô xong đó nhấn nút lưu thì báo cho hệ điều hành biết là lưu file txt với tên này.
    Khi đóng file txt thì báo cho hệ điều hành biết là không dùng file này nữa.

  • Tình huống 2: chương trình chạy tạo file, lưu và đóng(tự động).
    Chương trình tạo file thì báo cho hệ điều hành biết là đang mở 1 file.
    Khi lưu nội dung thì chương trình lấy nội dung được nhập lưu vào 1 nơi nào đó trong ổ cứng.
    Khi đóng file thì báo cho hệ điều hành biết là không dùng file này nữa. Để tránh bị tràng bộ nhớ.

Tóm lại: khi mở 1 file để thao tác như đọc, lưu thì luôn luôn phải thực hiện thao tá đóng. Để báo cho hệ điều hành biết là không sử dụng file này nữa để tránh bị tràn bộ nhớ…

viết 00:32 ngày 01/10/2018

Txt=open(tenfile).read() thì bạn không cần đóng file vì python đã tự làm việc này Đoạn code bạn đưa ở trên thì đóng out_file và input là đúng rồi, còn indata là một đối tượng bình thường dùng lưu nội dung file thôi chứ không phải là một đối tượng file. Còn ý nghĩa về việc close file, bạn có thể xem trả lời ở topic này:

1 topic hay! Sau đây là 1 số ý kiến của mình 1/ Trước hết là giới hạn của hệ điều hành. Chẳng hạn 1 hệ điều hành chỉ cho mở 1 số file nhất định cùng lúc thì nếu quên đóng file đi -> File cứ mở mãi -> Gây hao tốn! Hoặc có thể gây tốn bộ nhớ khi mở các file bự khổng lồ mà quên đóng đi @_@ 2/ Đặc biệt là các file dùng để ghi, thì hệ điều hành ko ghi trực tiếp ra file. Mà ghi qua bộ đệm (buffer) sau đó mới ghi ra file. Tương tự các file đọc, thì nó cũng đc lưu vào buffer sau rồi…

Hưng viết 00:36 ngày 01/10/2018

Thanks !!!

Hưng viết 00:26 ngày 01/10/2018

Thanks ,a có FB không ạ, Nếu được thì addfriend với em. Một số thứ em cần hỏi ạ!

viết 00:24 ngày 01/10/2018

Mình ít dùng FB. Có câu hỏi gì nên đặt trên này bạn ạ, trên đây nhiều người giỏi lắm họ sẽ cho bạn những câu trả lời tốt nhất với lại nhiều câu trả lời bạn sẽ có cách nhìn tổng quát hơn, mau “thấm” hơn.

Hưng viết 00:36 ngày 01/10/2018

s = f.read() # đọc toàn bộ file và lưu vào s

Nội dung sẽ được lưu vào s và sẽ ko bị mất đi đúng ko ạ?

Hưng viết 00:37 ngày 01/10/2018

Cho em hỏi tiếp ạ, nếu muốn lưu trữ nội dung của file thì indata cần phải mở/đọc file thì mới lưu trữ được nội dung của file đúng không ạ? Nếu đã mở file ra thì cần phải close lại? em không hiểu chỗ này.Với lại khi đọc thì file sẽ được đưa ra bộ nhớ đệm rồi mới vào đĩa?Close là lưu và đóng !!,khi đọc , file từ bộ nhớ đệm được lưu nên đĩa.Do đó ,khi đọc cần phải close file ,ko phải là cần phải close file mà là lưu file( close thì lưu và close luôn rồi).
Đó là suy đoán của em mong anh chỉ bảo với ạ!

Hưng viết 00:22 ngày 01/10/2018

Đính chính lại khi đọc có cần phải close file không ạ?

Chế Tiệp Chân Khoa viết 00:29 ngày 01/10/2018

khi đọc vẫn phải lưu, vì cho dù là đọc vẫn phải mở 1 connection từ file đến chương trình
giống như trên kia mình đã nói, nếu đã lưu vào biến thì phải close
không lưu vào biến thì python sẽ tự close

Với lại khi đọc thì file sẽ được đưa ra bộ nhớ đệm rồi mới vào đĩa?Close là lưu và đóng !!,khi đọc , file từ bộ nhớ đệm được lưu nên đĩa

bạn có gõ nhầm “đọc” vs “ghi” ko vậy

viết 00:22 ngày 01/10/2018

Nguyên tắc là bạn mở một file ra, dù ở chế độ nào ('r','w','a',…) thì vẫn phải đóng file lại. Nếu bạn dùng theo kiểu Txt=open(tenfile).read() thì sau lệnh này python sẽ tự close file vì nó là garbage collector, kiểu này tuy gọn, không lo quên close file nhưng nếu có một ngoại lệ (exception) được ném (throw) ra thì bạn sẽ không bắt được để xử lý (handling). Còn dùng một đối tượng để tham chiếu (reference) tới file ví dụ : doi_tuong=open(tenfile) thì file của bạn vẫn mở cho tới khi kết thúc chương trình, cho tới khi nào nó bắt gặp doi_tuong.close() thì file mới đóng. Cho nên bắt buộc bạn phải close file trong trường hợp này, nguyên nhân thì ở topic mình đã dẫn ở trên. Nên dùng kiểu này hơn bởi vì code của bạn sẽ dễ bảo trì và quản lý hơn so với trường hợp garbage collector ở trên.

Hưng viết 00:33 ngày 01/10/2018

a có thể nói rõ từng bước để đọc 1 file ko ạ?em vẫn chưa thể hình dung được. Mong a thông cảm ạ!

Hưng viết 00:32 ngày 01/10/2018

làm sao để biết nó là garbage collector ạ?
Em còn câu hỏi cuối ạ, như trong code dài dài phía trên, thì là trường hợp dùng một đối tượng để tham chiếu tới file đúng không ạ? indata để có thể lưu trữ được nội dung của file thì phải mở/đọc thì mới lấy được nội dung của file đúng không ạ?Vậy sao khi em close file rồi mà vẫn có thể đọc file thông qua indata

Bài liên quan
0