01/10/2018, 09:48

Exit (ctrl+D) trước khi xóa nhưng vẫn bị delete?

Mình có đoạn code như sau:

> # -*- coding: utf-8 -*-

> from sys import argv

> script, filename = argv

> print "Bạn có muốn mở file này?: %s" % filename
> print "Nếu có vui lòng nhấn enter"
> print "Nếu không vui lòng nhấn 'ctrl+c'"

> raw_input("...")
> open_file = open(filename)

> print open_file.read()
> print "Ok bây giờ tôi sẽ xóa nó"
> delete_file = open(filename, 'w')
> print "Đang trong quá trình xóa..."
> raw_input() # Tạm dừng trước khi thực hiện lệnh xóa
> delete_file.truncate()
> print "File đã bị xóa"

Nhưng không hiểu sao mình đã add code raw_input() trước line delete_file.truncate()
Theo mình nghĩ khi tới line raw_input nếu mình enter nó sẽ xóa nhưng không hiểu sao mình bấm ctrl+D thì nội dung trong file vẫn bị xóa?
Mọi người giaỉ thích giúp mình với

Nguyễn Duy Hùng viết 11:53 ngày 01/10/2018

Mình thì nghĩ khi bạn bấm ctrl+D thì nó sẽ đọc vào ký tự này ‘\x04’ rồi nhảy xuống lệnh delete chứ không tạm dừng đâu =))).

NG viết 11:51 ngày 01/10/2018

delete_file = open(filename, ‘w’)

file = open(myfile, mode)

open là function trả về stream object, function clone của io.open, bạn nên xem thêm về module io trong python nhé.
Trở lại câu hỏi của bạn, khi bạn gọi open, sẽ có stream position trỏ vào vị trí chỉ định trong nội dung của bạn.
Khi bạn gọi mode ‘W’, trong io.open, w có nghĩa là ghi đè, do đó, con trỏ(không phải pointer đâu nhé) sẽ ở vào vị trí 0. nên file của bạn sẽ không có nội dung.
Đoạn code của bạn chỗ delete_file = open(filename, 'w') đã vô tình xóa nội dung file của bạn rồi.

để hiểu rõ hơn, mình viết cho bạn 1 đoạn code thí nghiệm nhỏ nhé:

# Mình có 1 file có nội dung như sau
with open('file1', 'w') as f:
    f.write('abc')
# Mình mở file ra để đọc:
f = open('file1')
print(f.read())
# Lần đầu tiên mình sẽ có kết qủa:
# abc
print(f.read())
# Lần này sẽ không in ra đc gì, lý do sau lần đầu tiên, con trỏ đã ở điểm cuối
# mình cho con trỏ đọc trở về 0
f.seek(0)
print(f.read())
# Lần này mình lại có kết qủa như lần đầu

Mode write và add cũng tương tụ như vậy, bạn có thể suy ra

Cao Thanh Hiếu viết 12:04 ngày 01/10/2018

Mình cũng chả biết nữa, nhưng mà như comment của @nahi08 ahi nữa thì mình xóa mode ‘w’ thì khi ctrl+d nó sẽ out ra và không xóa file nữa

Cao Thanh Hiếu viết 11:53 ngày 01/10/2018

Em mới học python theo anh ltd (learnpythonthehardway) tới lv 16 thui à
Nên câu trả lời của anh em không hiểu mấy
Nhưng mà em cũng thử xóa mode ‘w’ thì line dưới nó báo lỗi anh ơi
delete_file.truncate() file not open for writing

Kiểu này chắc em phải học tiếp thôi, chứ hỏi như này toàn những kiến thức chưa học dễ bị sợ qúa

Thành Phạm viết 11:58 ngày 01/10/2018

Nghĩa là trước dòng print "Đang trong quá trình xóa..." thì file đó đã bị xóa rồi, do 'w' là mở file sau đó xóa nội dung file luôn, vậy cách sửa là chuyển dòng delete_file = open(filename, 'w') xuống dưới raw_input()

Cao Thanh Hiếu viết 11:48 ngày 01/10/2018

Haha, đơn giản vậy mà mình không nghĩ ra.
Do mình dốt nên mình rất thích những câu tl ngắn gọn như này

NG viết 11:59 ngày 01/10/2018

Đó là cách đối phó trị ngọn không trị gốc, sở dĩ mình giải thích các thứ như stream position là để bạn tự tìm ra cách.
Chính xác là đổi ‘w’ thành ‘a’ chứ không phải là xóa ‘w’.
Cái nữa là bạn hỏi giải thích cho bạn tại sao nên mình mới nói về vấn đề này. Chứ chỉ bạn sửa code để chạy được thì dễ lắm.
Hiểu được những gì mình nói bạn mới đi sâu vào sử dụng hiệu quả stream object, mình ví dụ

>>> # File có nội dung abcdef
>>> with io.open('afile', 'w') as f:
...     f.write('abcdef')
...
>>> # Sử dụng mode r+ và seek để trỏ vào vị trí muốn sửa
>>> with io.open('afile', 'r+') as f:
...     # Trỏ vào vị trí chữ c
...     f.seek(3)
...     # Sửa lại nội dung tiếp theo
...     f.write('DEFG')
...
>>> # Nội dung mới của file bây giờ là 'abcDEFG'
>>> with io.open('afile') as f:
...    print( f.read())
...
abcDEFG

Áp dụng vào bài trên của bạn, mình có thể dùng cách này viết nâng cao function xóa từng chữ cái từ từ theo từng giây, cho tới khi bạn ctr+D hoặc file xóa hết.

Cao Thanh Hiếu viết 11:57 ngày 01/10/2018

Dạ vâng cảm ơn anh đã nhiệt tình chỉ dạy, em sẽ từ từ nghiên cứu câu tl của anh.
Có lẽ em cũng hiểu được phần nào rồi.

Mà anh dùng python 3 phải không? Em nhìn code hơi lạ, chứ nếu là python 2.7 thì có lẽ em cũng không bị rối í.

NG viết 11:55 ngày 01/10/2018

2 hay 3 mặc dù nói khác nhau nhưng thực ra không khác là mấy, chỉ có vài cái syntaxe nhỏ nhỏ thôi, chắc bạn thấy cấu trúc with … as, cái đấy là đặc sản của python, rất hữu ích. 2 hay 3 đều có.
Hiện tại python 3 đã rất ổn định rồi, khuyên bạn học thì học luôn 3 đi. Tất cả những gì của python2, python3 đều có, nhưng python3 có thì chưa chắc python2 đã làm được.

Cao Thanh Hiếu viết 11:57 ngày 01/10/2018

Mình thì học theo cuốn learnpythonthehardway í (anh ltd dạy lại), Thầy bảo không dùng python 3 nên mình cũng không học mắc công rối.

Cao Thanh Hiếu viết 11:49 ngày 01/10/2018

4 Ngày qua mình lười, bỏ học nên nay ôn tập lại những gì đã học được nhưng không hiểu sao bị báo lỗi này rất khó hiểu.
SyntaxError: EOF while scanning triple-quoted string literal
Đây là code của mình.

from sys import argv
scrip, ten_file = argv

print "Ban co muon mo file: %s" % ten_file
print "Enter de mo, ctrl+c de thoat"
raw_input()
open_file = open(ten_file, 'r')
print open_file
print """ Ban co muon xem lai no khong?
Neu co hay nhan enter, hoac ctrl + d de thoat"
raw_input()
print open_file

#print "Bay gio toi se xoa no"
#print "Neu muon xoa hay nhap lai ten file"
#raw_input()
#delete_file = open(ten_file, 'w')
#delete_file.truncate()

#print """
File da bi xoa
Ban hay viet lai 1 vai dong de thay the cho file da xoa
Toi se goi i cho ban
"""
#line1 = raw_input("Ban bao nhieu tuoi? ")
#line2 = raw_input("Ban da ket hon chua? ")
#line3 = raw_input("ban co thich lap trinh khong? "

#line1
#line2
#line3
#file_moi = open(filename, 'w')
#file_moi.write = (line1 + \n)
#file_moi.write = (line2 + \n) 
#file_moi.write = (line3 + \n)
#file_name.close()
#print "ok, file cua ban da duoc save"
#print "Hay nhap lai ten file de xem nhung gi ban moi dien vao"
#raw_input(">")
#mo_lai = raw_input()
#open_lai = mo_lai.open()
#print open_lai.read()

Do lỗi quá nên mình bọc comment lại rồi mà nó vẫn báo lỗi tít ở dưới line 43 mặc dù toàn bộ file của mình chỉ max có 41 line
Và line ở dưới này nó cũng báo lỗi, và trong vim thì mình thấy nó highlight số 1 và chữ file
thật sự khó hiểu. Theo qua trình mình học thì tất cả những kí tự trong “”" sẽ không có highlight trừ những kí tự đặc biệt : % \

#print “”"
File da bi xoa
Ban hay viet lai 1 vai dong de thay the cho file da xoa
Toi se goi i cho ban
“”"

NG viết 11:59 ngày 01/10/2018

open_file = open(ten_file, ‘r’)
print open_file

Bạn in object làm gì nhỉ ?

Lỗi là bạn có 3 lần “”"

#print “”"

bỏ chỗ này đi

NG viết 11:55 ngày 01/10/2018

#file_moi = open(filename, ‘w’)
#file_moi.write = (line1 + \n)
#file_moi.write = (line2 + \n)
#file_moi.write = (line3 + \n)
#file_name.close()

bạn coi lại sự khác nhau giữa w, a, r, wb, ab, rb, r+, w+ nhé

Cao Thanh Hiếu viết 12:02 ngày 01/10/2018

Ủa. Mình nhớ không lầm thì read là đọc
Thay vì mình print open_file thì mình thêm thuộc tính read trong open luôn không được hả ta?

Cao Thanh Hiếu viết 11:49 ngày 01/10/2018

Còn chỗ “”"
Mình không nhớ học ở bài mấy nhưng nó giúp mình viết multi line mà không cần phải print nhiều lần mà?

À là do code mình ở trên thì 3" nhưng ở dưới chỉ có 1" đóng này nên nó báo lỗi, nay qua sublime mới nhìn rõ chữ ở vim code nó đỏ đỏ tối thui ~_~

Bài liên quan
0