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
Close file là gì?
Em có đọc được ở trên là khi đọc thì sẽ được lưu vào bộ nhớ đệm rồi mới xuất ra!
Bạn tham khảo ở đây về GC, trường hợp của bạn open file không dùng một đối tượng tham chiếu tới thì nó là một GC.
Câu hỏi của bạn mình không hiểu lắm, indata
là một đối tượng bình thường thôi mà, không phải là một đối tượng file như input
hay out_file
. Nếu bạn học qua ngôn ngữ khác, như C chẳng hạn, thì có thể ví indata
như một biến, còn out_file
hay input
là con trỏ file cho dễ hiểu.
Có nghĩa là indata là nó lưu nội dung của file , thì phải mở file và đọc thì mới lưu trữ được, sau khi mình đóng file rồi mà indata vẫn có thể đọc được (dùng lệnh print thì in ra nội dung file) trong khi đã đóng file rồi
À, sau khi bạn thực hiện indata=input.read()
thì nội dung của file đó đã được lưu vào đối tượng. Sau khi thực hiện input.close()
thì indata
vẫn còn giữ nội dung của file đã được lưu trước đó chứ không mất đi, nó chỉ mất đi khi kết thúc chương trình của bạn. Nhớ là indata
và input
là hoàn toàn độc lập với nhau.
nói đơn jản thì indata ở code trên chỉ là 1 string thôi (nó lưu gía trị trả về của file.read()
mà file có type io.TextIOWrapper
(với mode r, các mode khác sẽ là type khác, đại khái cũng là wrapper hay buffer gì đó)) cho nên ko liên quan gì đến file đã mở trước đó cả
vậy nên khi viết gọn s = open('filename').read()
thì s vẫn có thể dùng dc khi mà file đã bị close từ khi mới read xong
Em cũng chả rõ là Độc Lập với nhau là như nào cả . Mà nói chung là file đã được đóng bình thường đúng ko ạ?
Muốn lưu trữ nội dung của file thì phải mở ra để đọc, thì nó sẽ mở file ở indata? Có phải vậy không? Hay em hiểu sai rồi? Nếu như vậy, thì phải đóng lại bằng cách input.close có được ko! Cái cốt lõi em thắc từ lúc mới hỏi ở đây!
Trả lời giúp em với ạ!!!
Mở file là input
chứ bạn, indata
chỉ dùng để lưu giữ những gì bạn đọc được từ input.read()
thôi. Thí dụ bạn muốn chụp một bức ảnh bên trong cái hộc tủ thì bạn tưởng tượng file của bạn là cái hộc tủ, input
là cái chìa khóa để mở và đóng hộc tủ, indata
là cái máy ảnh để lưu những bức ảnh bên trong hộc tủ mà bạn chụp được.
À, cuối cùng em cũng hiểu, như a nói ở trên thì nó sẽ mất đi khi kết thúc chương trình, vậy có ảnh hưởng gì đến chương trình của mình không?
(input.read()
thì nó sẽ mở file sau đó đọc nội dung của file và sẽ được gán vào indata
và indata
sẽ lưu trữ nội dung này! Chứ indata
không hề liên qua gì đến input
cả!!)
Theo bạn thì nó sẽ ảnh hưởng gì tới chương trình .
Đúng rồi, chắc bạn mới học lập trình nên hơi rối, cứ tìm những bài liên quan tới file, code thật nhiều vào là mau nắm vững.
Có phải là nó lưu trữ nội dung file, mà ở[quote=“usersyer, post:7, topic:30726”]
out_file.write(indata)
[/quote]
thì sẽ không viết nội dung gì đúng không ạ? Nó chỉ mất đi khi kết thúc chương trình, nhưng đang trong chương nên nó vẫn viết được nội dung của indata?
Đúng rồi, sau khi thực hiện indata=input.read()
thì trong indata
có nội dung của file input
, dù input
đã đóng, nên out_file.write(indata)
sẽ ghi những gì chứa trong indata
lên out_file
. Và indata
biến mất khi chương trình của bạn kết thúc
from sys import argv
from os.path import exists
script, from_file, to_file = argv
input = open(filename)
indata = input.read()
out_file = open(to_file, 'w')
out_file.write(indata)
print "Alright, all done
input.close() # Dong file roi
out_file.close()
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?Có phải là sau khi thực thi rồi mới xóa đi nên có thể viết được?
Indata với Txt có giống nhau không? Cả 2 cũng chỉ dùng để lưu trữ nội dung của file thôi phải ko ạ?
A ơi, gc thì nó áp dụng cho những cái nào ạ? Có phải là cái gì mà không được gán trị(tham chiếu tới) thì sẽ là gc và bị xóa đúng không ạ?
Em có code Txt = open(filename)
Txt.read()
Thì Txt.read() sẽ là gc đúng không ạ? Vì nó không được tham chiếu --> gc do đó nội dung trả về của nó bị xóa? Nếu vậy thì print Txt.read() thì nếu Txt.read() do ko được tham chiếu sẽ là gc và bị xóa thì sao nó lại print ra đc?
out_file
tham chiếu tới to_file
sau khi open --> không phải GC. (cho nên cuối chương trình bạn mới có dòng out_file.close()
)
Không phải sau vài giây, mà là sau khi một câu lệnh với nó kết thúc, ví dụ:
Txt=open(filename)
print Txt.read()
thì Txt.read() sẽ mất sau khi được in ra.
Đúng rồi, chức năng giống nhau.
Đúng, sau khi print
thì Txt.read()
cũng mất. GC biến mất sau khi thực hiện xong câu lệnh chứ không phải là sau vài giây
Tạm thời bạn cứ hiểu là như vậy, sau này học sâu về hướng đối tượng, cơ chế hàm tạo, hàm huỷ, cơ chế quản lý bộ nhớ bạn sẽ hiểu. Giờ bàn tới hơi lang man, bạn sẽ dễ rối. Các thao tác với file chỉ có nhiêu đó thôi, code nhiều tự nhiên sẽ hiểu ra.
Ý của câu kia là out_file.write(indata) không được tham chiếu nên nó là gc , vậy sau khi viết xong nó sẽ bị mất?
Và nếu sửa indata thành open(filename).read() trong code out_file.write() thì sau khi viết được nội dung của file (xong 1 câu lệnh với open(from_file).read() ) thì open(from_file).read() sẽ bị mất đi vì là gc và out_file.write cũng thế? indata cũng giống như open(from_file).read() nhưng **open(from_file).read() bị mất đi , indata thì lưu nội dung của file và ko liên qua gì đến file còn open(from_file).read() phải mở file để đọc?