Đóng file trong python

from sys import argv
from os.path import exists

script, from_file, to_file = argv
out_file = open(to_file, 'w')
out_file.write(indata)
print out_file
print "Alright, all done."


input.close() # Dong file roi
out_file.close()
print indata

Như trong code này out_file.write(indata) không được tham chiếu thì sẽ là gc và bị xóa đi sau vài giây, nhưng sau khi kết thúc chương thì nó vẫn có thể viết được nội dung của indata?(Nếu là gc và bị xóa đi rồi sao vẫn có thể ghi được?)

hiểu đúng rồi đấy

cái code hầm bà lằng xí tố này là sao,
có phải indata = open(from_file).read() ko
vậy indata là string và ko liên quan gì tới out_file cả
method .write() ko trả về cái gì cả

và chỉ print dc string thôi, ko print dc file nhé

1 Like
**from sys import argv
from os.path import exists

script, from_file, to_file = argv
input = open(from_file)
indata = input.read()
out_file = open(to_file, 'w')
out_file.write(indata)

input.close() #Dong file roi
out_file.close()**

(Em ghi nhầm) Code trên thì out_file.write(indata) nếu không được tham chiếu thì sẽ là gc => xóa! nhưng sao vẫn có thể write ? Hay nó thực thi(viết) xong rồi mới bị xóa?
input = open(filename), indata = input.read() với indata = open(file).read() thì giống nhau là lưu trữ nội dung của file còn khác nhau ở chỗ nào ạ?
((–Nếu vậy thì print f.read() sau khi thực hiện lệnh này xong sẽ trả về nội dung và in ra màn hình, sau đó bị xóa đi vì không được tham chiếu,mặc dù được in ra màn hình nhưng nội đã bị xóa đi rồi? --))

input = open(filename), indata = input.read() với indata = open(file).read() thì giống nhau là lưu trữ nội dung của file còn khác nhau ở chỗ nào ạ?
((–Nếu vậy thì print f.read() sau khi thực hiện lệnh này xong sẽ trả về nội dung và in ra màn hình, sau đó bị xóa đi vì không được tham chiếu,mặc dù được in ra màn hình nhưng nội đã bị xóa đi rồi? --))

open(from_file).write( open(to_file).read() ) Thì đầu tiên sẽ open(from_file) để viết sau đó viết! Vì open(from_file) không có tham chiếu nên bị đóng(có xóa không nhỉ?) Còn write thì không trả về gì cả nên không cần tham chiếu để lưu! Tiếp đó mở to_file và đọc vì không có tham chiếu nên cả 2 sẽ bị đóng(xóa gì đấy) < mở thì bị đóng còn đọc thì bị xóa?>Thế thì làm sao nó viết được ạ?

càng lúc càng lộn xộn, open(filename) là 1 file object (là buffer đó) thì nếu được gán vào biến thì phải close, ko được gán vào biến thì tự close, ở đây gán vào input , nên dùng xong phải gọi input.close()
open(file) ở sau là file object, mình gọi method .read() của nó rồi lưu gía trị (string) vào indata
=> open(file) ko dc lưu vào biến => tự close => ko cần gọi close
và indata là string (chứ ko phải file object) nên có thể print

1 Like

đây là 1 statement
nói đơn jản, garbage collecting sẽ xảy ra trước khi statement này thực thi , và sau khi statement này thực thi, ko xảy ra jữa lúc đó, nên statement này vẫn thực thi bình thường

1 Like

Em vẫn chưa hiểu rõ ạ?
Theo em biết thì buffer là bộ nhớ đệm, vậy file object là bộ nhớ đệm ạ?

à nhầm, expression cơ, trong lúc thực thi expression đó, thì rõ ràng là nó hữu dụng, nên python runtime sẽ “bảo kê” cho những vùng nhớ đó (cái này xảy ra ở C level cơ, ko phải python level) , cho nên garbage collecting (thằng dọn rác) sẽ ko đụng vào những vùng nhớ đó
còn sau khi thực thi xong hết expression đó rồi thì ko được bảo kê nữa, sẽ bị xóa, mà lúc đó việc ghi file cũng đã kết thúc rồi, đâu còn cần nữa

file object là quản lí của buffer, mình chỉ tương tác ján tiếp buffer thông qua file object

1 Like

Mình thấy bạn chưa hiểu thế nào là biến không còn tham chiếu rồi

1 Like

Có nghĩ là nó là expression(cái code ở trên) , và trong lúc thực thi thì sẽ được python runtime sẽ “bảo kê” cho nó và garbage collecting sẽ không làm gì được, và sau khi thực thi xong thì python runtime nó không “bảo kê” nữa nên bị xóa đi

1 Like

Là sao ạ? Giải thích giúp em được không ạ?

khi viết sẽ được viết ở buffer là do mình tương tác gián tiếp với buffer qua file object?

để giải thích cho bạn mình sẽ dùng 1 ngôn ngữ khác có cú pháp tường minh hơn để giải thích cho bạn hiểu thế nào là 1 biến không còn tham chiếu.

    func someFunc(c: Foo){
        var a = Foo() // a bây giờ sẽ tham chiếu tới đối tượng Foo() vừa tạo ra tạm gọi là Foo1
        var b = Foo() // b bây giờ sẽ tham chiếu tới đối tượng Foo() vừa tạo ra, tạm gọi là Foo2
        a = b // bây giờ a sẽ tham chiếu tới đối tượng mà b đang tham chiếu gọi là Foo2, lúc này Foo1 do a giữ lúc trước sẽ gọi là đối tượng không còn tham chiếu và sẽ bị GC xóa bỏ do không còn tham chiếu nào trỏ đến Foo1.
        c = b // lúc này FooXyz do c đang giữ sẽ mất 1 tham chiếu nhưng không bị GC xóa do vẫn còn tham chiếu ở ngoài scope
        a = null (del a) // hủy tham chiếu a tới Foo2 (do a đang tham chiếu tới Foo2)
        b = null (del b) // hủy tham chiếu tới Foo2  // Foo2 sẽ bị GC hủy do không còn tham chiếu nào trỏ đến Foo2
    }
/*  
Khi ra ngoài 1 scope thì tất cả những tham chiếu được tạo ra bên trong scope sẽ bị hủy. 
Đối tượng nào không còn tham chiếu, như ở trên Foo1 và Foo2 ở trên sẽ bị GC xóa mặc dù mình không hề gọi c = null (del c) để hủy tham chiếu của c tới Foo2, trừ FooXyz
*/
1 Like

mình gọi f.write() để ghi -> method .write() là của file object, nó thực hiện thao tác ghi lên buffer
f.push() -> lưu nội dung trong buffer vào disk
f.close() -> f.push() + xóa buffer (vì ko dùng nữa)

1 Like

Thế thì mấy con số 1,2,3,… hay 1 đoạn chuối nào đó không có tham chiếu thì sẽ là gc và bị xóa đi?
Sau khi học file xong em bị loạn mất rồi! Những cái nào có thể tham chiếu được?Có phải là khi gắn giá trị nào đấy cho 1 biến thì biến đấy sẽ tham chiếu tới giá trị đó?
a = 2 # a sẽ tham chiếu tới 2 a = 3 # a sẽ tham chiếu tới 3 và 2 sẽ không còn tham chiếu , vùng nhớ lưu trữ 2 sẽ bị xóa đi ?? và a bây giờ sẽ có giá trị là 3

Sau khi mình print một chuối chẳng hạn hoặc một phép tính thì thì nó vẫn chưa được tham chiếu -->gc --> xóa?(Sao vẫn in ra được?)
Có phải trường hợp gc --> xóa chỉ áp dụng với file thôi đúng không ạ?

Cảm ơn a, mấy cái này em vẫn chưa học lên hơi khó hiểu tí

Print f.read() thì sẽ trả về string cho mình và sẽ được in ra màn hình qua lệnh print mặc dù giá trị trả về đã bị xóa!

Cho em hỏi lại cái out_file.write(indata) có phải là nó không trả nội dung gì về vùng nhớ do đó ko cần tham chiếu đến và sẽ không là gc còn read thì sẽ trả về vùng nhớ nhưng không tham chiếu đến sẽ là gc?

nó áp dụng xuyên suốt toàn bộ python, bạn có thể tham khảo cuốn learning python

trong suốt qúa trình print, chuỗi hoặc phép tính đó dc sử dụng, do đó vẫn được python “bảo kê” !
sau khi print xong rồi thì cái mà bạn thấy trên màn hình (trong terminal) ko có liên quan gì tới chương trình đang chạy sất (lúc đó terminal sẽ lưu chuỗi kết qủa đó)

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