2010-12-30 29 views
33

Tôi đang xem cuốn sách Python của Zed Shaw. Tôi hiện đang làm việc trên các chương mở và đọc các tập tin. Tôi tự hỏi tại sao chúng ta cần phải làm một truncate, khi chúng tôi đã mở tập tin trong một chế độ 'w'?Tại sao cắt ngắn khi chúng tôi mở một tệp ở chế độ 'w' trong python

print "Opening the file..." 
target = open(filename, 'w') 

print "Truncating the file. Goodbye!" 
target.truncate() 
+15

Để cho thấy rằng nó có thể được thực hiện. –

+1

Phương pháp này không hoạt động ở chế độ chỉ đọc. –

Trả lời

33

Nó dư thừa, như bạn thấy, mở ở chế độ ghi sẽ ghi đè lên tệp. Thông tin thêm tại Input and Output phần tài liệu Python.

1

Đó chỉ là sự phản ánh của ngữ nghĩa posix chuẩn. xem người đàn ông fopen (3). Python chỉ kết thúc tốt đẹp đó.

+3

'fopen (3)' đề cập đến nó bị cắt ngắn tự động để không cần thêm 'truncate()'. – ismail

+1

Bạn nói đúng. Có lẽ anh ta đã phạm sai lầm? – Keith

+0

Hoặc như Ignacio đã chỉ ra, nó chỉ có thể là để cho thấy rằng có một phương thức truncate() và cách nó hoạt động. – Animesh

27

So Zed Shaw gọi cắt ngắn() trên tệp đã bị cắt bớt. OK, điều đó thật vô nghĩa. Tại sao anh ta làm điều đó? Ai biết!? Hỏi anh ấy!

Có thể anh ta làm điều đó để cho thấy rằng phương pháp tồn tại? Có thể được, nhưng đó sẽ là khá daft, kể từ khi tôi đã không bao giờ cần phải cắt ngắn một tập tin trong 15 năm của tôi như là một lập trình để nó không có chỗ trong một cuốn sách newbie.

Có thể anh ta làm điều đó bởi vì anh ta nghĩ anh ta phải cắt bớt tập tin, và anh ta đơn giản là không nhận thức được rằng nó là vô nghĩa?

Có thể anh ta cố ý gây nhầm lẫn cho người mới? Điều đó sẽ phù hợp với bản modus operandi nói chung của anh ấy, dường như cố ý làm mọi người thất vọng vì hoàn toàn không có lý do gì.

Cập nhật: Lý do khiến việc này hiện rõ ràng. Trong các phiên bản sau này, ông liệt kê câu hỏi này như là một "câu hỏi phổ biến" trong chương, và bảo bạn hãy đọc tài liệu. Do đó, có:

  1. Dạy bạn đọc tài liệu.
  2. Hiểu mọi phần mã bạn sao chép dán từ một nơi nào đó trước khi bạn sao chép-dán.

Bạn có thể tranh luận nếu đây là phong cách giảng dạy tốt hay không, tôi sẽ không biết.

Số lượng "Trợ giúp tôi không hiểu cuốn sách Shed Zaws" -quyết về SO đã giảm xuống, vì vậy tôi không thể nói rằng nó tồi tệ hơn bất kỳ cuốn sách nào khác, có lẽ có nghĩa là nó tốt hơn nhiều. :-)

+11

+1 cho đoạn cuối;) – ismail

+0

@Lennart Regebro Bắt đầu với Django giới thiệu người dùng đến cuốn sách này, Hai muỗng Django đề cập đến sử dụng LPTHW. Phần lớn tôi tin bởi vì nó là một việc học bằng cách làm sách, không chỉ là lý thuyết. Tôi đang sử dụng + codeacademy này bởi vì tôi cần phải làm gì để tìm hiểu.Vì vậy, nếu bạn là quan trọng của phương pháp tiếp cận của mình, những người làm bạn đề nghị? – sayth

+2

@sayth: Tôi đồng ý với cách tiếp cận chung của anh ấy, nhưng nó gây ra rất nhiều câu hỏi. Những người đã giảm xuống, có lẽ ông đã sửa chữa các vấn đề. Ví dụ, câu hỏi này bây giờ được liệt kê như là một "câu hỏi phổ biến" trong chương này, nơi Zed nói với bạn để đi và đọc các tài liệu và con số nó ra cho chính mình. Vì vậy, có lẽ đây là một cuốn sách hay. –

15

Nếu bạn muốn đọc các câu hỏi trước khi hỏi nó, anh trả lời đó cho bạn:

Điểm thêm: "Nếu bạn cảm thấy bạn không hiểu điều này, quay trở lại thông qua và sử dụng Một bình luận tiếng Anh đơn giản phía trên mỗi dòng sẽ giúp bạn hiểu, hoặc ít nhất là cho bạn biết những gì bạn cần để nghiên cứu nhiều hơn.

Viết kịch bản tương tự bài tập sử dụng readargv to đọc tệp bạn vừa tạo.

Có quá nhiều lần lặp lại trong tệp này. Sử dụng chuỗi, định dạng và các lần thoát để in ra line1, line2line3 chỉ với một target.write() lệnh thay vì 6.

Tìm hiểu lý do tại sao chúng tôi phải vượt qua một thông số mở rộng để thêm 'w'. Gợi ý: cố gắng mở để an toàn bằng cách làm cho bạn rõ ràng nói rằng bạn muốn viết một tệp .

Nếu bạn mở tệp bằng chế độ 'w', thì bạn có thực sự cần target.truncate() không?

Go đọc các tài liệu cho chức năng mở Python và xem nếu đó là sự thật "-.. Zed Shaw

Ông dứt khoát muốn bạn tìm thấy những điều này ra cho chính mình, đây là lý do tại sao tín dụng thêm mình là rất quan trọng.

ông cũng tuyên bố rõ ràng rằng ông muốn bạn chú ý đến từng chi tiết. Mỗi vấn đề điều nhỏ.

+6

Đó là tất cả tốt và tốt, nhưng nó không phải luôn luôn là một phong cách giảng dạy hữu ích. Tôi sẽ thay vào đó cách tiếp cận chính xác được dạy ngay từ đầu, với lời giải thích về * tại sao * nó đúng, thay vì bắt đầu với những thứ vô dụng và sau đó mong người đọc có thể bận tâm với những gì trông giống như một câu hỏi tín dụng vô nghĩa một thông tin hữu ích thực sự hữu ích. –

+0

IMHO đây là câu trả lời đúng cho câu hỏi OP – quasoft

+0

Thực ra, @PlatinumAzure, nếu người đọc đọc lướt qua và không đọc chi tiết, chúng có thể tốt hơn bao gồm cả một cuộc gọi không có lệnh vô nghĩa tới '.truncate()' của thói quen. Bằng cách đó, họ biết cách xử lý các tệp đã mở đọc + ghi thông qua 'open (filename,' r + ') '. –

6

với truncate(), bạn có thể khai báo bao nhiêu file y Bạn muốn xóa, dựa vào nơi bạn đang ở trong tệp. Không có tham số, truncate() hoạt động như w, trong khi w luôn quét sạch toàn bộ tệp. Vì vậy, hai phương pháp này có thể hành động giống nhau, nhưng chúng không nhất thiết.

+0

Câu hỏi đặt ra là tại sao có một 'truncate()' (không có đối số) trong ví dụ. – EOL

7

Mặc dù không hữu ích khi cắt bớt khi mở ở chế độ 'w', nó rất hữu ích trong 'r +'. Mặc dù đó không phải là câu hỏi của OP, tôi sẽ để điều này ở đây cho bất cứ ai được dẫn dắt ở đây bởi Google như tôi đã làm.

Hãy nói rằng bạn đang mở (với chế độ 'r +', nhớ không có 'rw' chế độ) 5 dòng tệp json thụt vào và sửa đổi các đối tượng -ed json.load là chỉ có 3 dòng. Nếu bạn target.seek(0) trước khi ghi dữ liệu trở lại tệp, bạn sẽ kết thúc với 2 dòng rác sau. Nếu bạn target.truncate() nó, bạn sẽ không.

Tôi biết điều này có vẻ hiển nhiên, nhưng tôi ở đây vì tôi đang sửa lỗi xảy ra sau khi một đối tượng ở cùng kích thước chính xác trong nhiều năm ... bị giảm do thay đổi thuật toán ký. (Điều không rõ ràng là các bài kiểm tra đơn vị mà tôi phải thêm vào để ngăn chặn điều này là tương lai. Tôi đã viết đoạn mã dài nhất của mình bao giờ giải thích tại sao tôi thử nghiệm ký với 2 thuật toán lố bịch.)

Hy vọng điều này sẽ giúp ai đó.

+1

Cảm ơn bạn. Câu trả lời này, mặc dù điều này không thực sự trả lời câu hỏi như được hỏi, phù hợp với trường hợp sử dụng của tôi chính xác – BrDaHa

0

Khi bạn mở tệp ở chế độ ghi, bạn cắt bớt tệp gốc (mọi thứ đã có trước đó sẽ bị xóa). Sau đó, bất cứ điều gì bạn viết được thêm vào tập tin. Vấn đề là, viết muốn thêm thông tin từ đầu, và tăng IOError khi con trỏ còn lại ở cuối. Đối với loại văn bản bạn muốn sử dụng chắp thêm (mở tệp bằng đối số 'a +').

Các vấn đề liên quan