Đóng file trong python

Em có đoạn code thế này

>   ` open(filename,'w').write("nhap gi do")` 

như vậy thì không biết đóng như nào(bỏ qua python tự đóng file), nếu viết thêm như vậy

dongfile=open(filename)
open(filename,'w').write("nhap gi do")
dongfile.close()

thì dongfile là object mình close object lại là xong đúng không ạ?

1 Like

bạn sai vô cùng nghiêm trọng rồi :smiling_imp: dongfile mà bạn open ở dòng 1 với cái bạn open ở dòng 2 hoàn toàn khác nhau, ví dụ nho nhỏ:

a = 123456789123456789
b = 123456789123456789
a == b # true
a is b # false

thì giá trị của biến a và biến b tuy = nhau nhưng là 2 object khác nhau được lưu trong 2 vùng nhớ khác nhau
tham khảo cái này :

update nếu mình hiểu sai và bạn không bị nhầm lẫn như vậy thì câu trả lời là 3 dòng cuối cùng của quote trên nhé :joy:

1 Like

Ok, em hiểu rồi! tại em hiểu nhầm là cái dongfile sau khi được close sẽ lưu cái open kia lại vào nó . Mà a có facebook, nếu được thì kb với em, em còn nhiều thứ cần hỏi lắm

1 Like

không nên, hỏi gì bạn cứ lên forum mà hỏi, ai rảnh thì trả lời :joy:

3 Likes

A nói rõ cơ chế đọc file giúp em ạ?Em chỉ biết viết thôi!

1 Like

viết bá hơn đọc mà, biết viết sao lại không biết đọc, đọc thì chỉ có

f = open('filename') # mặc định mode là read
type(f) == io.TextIOWrapper # với mode read thì kiểu của đối tượng file là cái này
# chưa đọc, lúc này con trỏ ở đầu file
s = f.read() # đọc toàn bộ file
# lúc này con trỏ đã ở cuối file -> không thể đọc nữa
# bạn có thể tra cứu cách nào đó di chuyển con trỏ về đầu file, mình không nhớ rõ
# mà nhanh lẹ dễ nhớ nhất là mở lại file lần nữa
f.close() # đóng file, có thể bỏ dòng này vì ở dưới mình đã gán gía trị khác cho f, gía trị này sẽ mồ côi -> garbage collector
f = open('filename') # lúc này con trỏ ở đầu file
s = f.readline() # đọc 1 dòng
# lúc này con trỏ ở đầu dòng thứ 2, bạn có thể đọc tiếp, hoặc close file lại
# nếu bạn đọc tiếp = read() thì chỉ đọc ra phần còn lại của file thôi (từ vị trí con trỏ -> cuối)
f.close()
2 Likes

Mình print nó mà không cần close có được không ạ?

1 Like

có, là như thế này

s = open('filename').read()

khi đó file object ko lưu vào biến -> garbage collector -> tự close

3 Likes

file object là open(filename) phải ko ạ?
s = open(filename)
r = s.read()
Như trên thì phải cần close ạ?

2 Likes

nếu như mình ko gán cho open(tên của file) một biến thì nó sẽ là gc và tự close

2 Likes

khi viết thì save thì mới ghi lên file được, thế làm sao để đọc?

1 Like

A thông cảm giúp em nhé, có thể em hơi ngu nhưng em thật sự cần biết, và hiểu rõ hơn cũng cái indata bên kia

1 Like

A có thể trả lời giúp em cả 2 thì may quá, em mới học python thì thấy dễ , nhưng khi đến file là rồi lên!

1 Like

code trên giống với indata , s nó lưu nội dung của file , r có tự close ko ạ?
Khi s.close thì r sẽ làm sao ạ?

1 Like

đúng rồi

chuẩn như lê duẩn

đóng file lại và mở lại ở mode read (không đóng cũng được, nhưng phải lưu, nếu không sẽ không đọc được cái mình đã ghi vào trước đó)[quote=“usersyer, post:14, topic:30724”]
, r có tự close ko
[/quote]

r chỉ là 1 string thôi ( lưu gía trị trả về của s.read() , và r hoàn toàn không liên quan đến s

bạn đang tưởng tượng r là 1 ánh xạ của nội dung file s (là 1 cái gì đó phức tạp hơn nhiều)

P/S: không rep nhiều lần, nghĩ ra cái gì thêm thì edit lại rep đầu

4 Likes

Em vẫn không hiểu ở cái nếu là gc thì sẽ bị xóa sau khi kết thúc chương trình phải không ạ?Như thế có ảnh hưởng gì đến chương trình của mình không?
Cái nữa là:
f = open('filename')
đọc,viết file gì đó bla bla…
cuối cùng gán f = open('filename') giá trị này mồ côi là sao ạ?
Nếu mình gán không phải là f mà là một biến khác thì sao? Vd: a,b,c,d gì đó = open(filename)

1 Like

bạn đã học kĩ về biến trong python chưa, ở đây biến luôn là tham chiếu đến 1 vùng nhớ (kể cả những gía trị đơn jản nhất như 1 hay ‘a’, thì biến cũng không lưu trực tiếp mà chỉ tham chiếu đến vùng nhớ đó)
vậy một vùng nhớ dc khởi tạo nhưng không có (hoặc không còn) biến nào tham chiếu đến nó sẽ là gc và bị xóa ngay sau khi nó là gc vài jây ( là khi python runtime phát hiện ra nó là gc, vì python runtime chắc chắn vùng nhớ đó sẽ không dc sử dụng nữa)

chứ ko phải sau khi kết thúc chương trình

f = open('filename') # gọi hàm open, hàm open khởi tạo và trả về vùng nhớ chứa buffer, f lưu tham chiếu đến vùng nhớ đó (tạm gọi là mem1)
# python runtime check: mem1 dc tham chiếu bởi biến f, còn sử dụng, không xóa
s = f.read() # gọi method f.read(), trả về vùng nhớ chứa string (là nội dung file), s lưu tham chiếu đến vùng nhớ đó (tạm gọi là mem2)
# python runtime check: mem1 tham chiếu bởi f, còn sử dụng, ko xóa, mem2 cũng vậy
f.close() # save file và làm gì đó khiến mem1 nhỏ lại không đáng kể (ko xóa mem1, ko rõ python làm v làm j)
# python runtime chekc: mem1(lúc này không đáng kể) vẫn dc tham chiếu bởi f, mem2 vẫn dc tham chiếu bởi s , không xóa
del f # xóa biến f
# mem1 ko còn dc tham chiếu nữa (f bị xóa rồi), xóa, mem2 vẫn được tham chiếu bởi s, ko xóa

riêng ghi tắt

s = open('filename').read() # gọi hàm open, gọi method read() lên *gía trị trả về của hàm open* (mem1), lưu *gía trị trả về của read()* (mem2) vào s
# check : mem1 không có biến nào tham chiếu -> gc, bị xóa (và close lun, vì khi define hàm open ngta đã thiết lập như thế) , mem2 có s tham chiếu, ko xóa

P/S: từ đầu tới h sao ko có lấy 1 like vậy hả :joy:

3 Likes

Nếu như f bị xóa thì open(filename) sẽ làm sao ạ? open(filename) sẽ không có biến nào để tham chiếu? gc- xóa( sau khi bị xóa thì có ảnh hưởng gì đến chương trình của mình không?)

Nếu như không cho s tham chiếu tới f.read() thì f.read()
chả về nội dung, nhưng không được tham chiếu bởi cái gì cả, nội dung trả về sẽ bị xóa?
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?

1 Like
  • f.close() nghĩa là bạn đã làm xong việc với file đó rồi và ko dùng nữa, sau đó bạn gọi f.read() thì bị lỗi Read closed file
  • del f là xóa biến f (kèm theo cũng tự close luôn) , vì biến f ko còn tồn tại nữa nên f.read() sẽ bị lỗi Name not defined

Nói chung là khi bạn đã close hay del thì sau đó ko dc read nữa, vậy thôi, còn lại không ảnh hưởng gì tới chương trình hết

chuẩn, nếu bạn đang dùng interactive shell thì nó in lun lên màn hình

1 Like

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?

Và như code này, f = open(filename) sẽ mở file tại vùng nhớ và được tham chiếu bới f nhung khi mình f = open(filename) lần nữa sẽ mở file tại vùng nhớ khác(khác vùng nhớ lần đầu) do đó cái open(filename) ở đầu sẽ không được tham chiếu bởi f nữa mà f sẽ tham chiếu cho open(filename)thứ 2 này . Bởi vì open(filename) ở đầu được mở tại vùng nhớ 1(gọi đại) và open(filename) thứ 2 sẽ được mở tại vụng nhớ 2 do đó khi mình f = open(filename) thì open(filename) ở vùng nhớ 1 sẽ không còn tham chiếu bởi f nữa mà f sẽ tham chiếu cho open(filename) ở vùng nhớ 2? Do đó open(filename) ở vùng nhớ 1 sẽ bị đóng lại?

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