2012-03-15 27 views
5

Tôi đã gặp một vấn đề lạ khi làm việc với các tệp trong python. Hãy nói rằng tôi có một tập tin văn bản và một đoạn mã đơn giản mà đọc nội dung của tập tin và sau đó viết lại nó với nội dung không thay đổi gì.Đọc và viết của Python thêm x00 vào tệp

File.txt

Đây là một tập tin thử nghiệm

mã Python

f=open(File.txt,'r+') 
data=f.read() 
f.truncate(0) 
f.write(data) 
f.close() 

Sau khi chạy đoạn mã trên File.txt có vẻ là như vậy. Tuy nhiên, khi tôi mở nó trong một trình soạn thảo hex tôi đã ngạc nhiên khi thấy rất nhiều byte \x00 (NULL) trước nội dung thực tế của tệp văn bản, rằng không phải là ở đó trước đây.

Có ai vui lòng giải thích không?

Trả lời

9

Giả sử tệp của bạn có 20 byte trong đó. Vì vậy, f.read() đọc 20 byte. Bây giờ bạn cắt bớt tệp thành 0 byte. Nhưng con trỏ vị trí trong tệp của bạn vẫn ở mức 20. Tại sao nó không? Bạn chưa di chuyển nó. Vì vậy, khi bạn viết, bạn bắt đầu viết ở byte thứ 21. Hệ điều hành của bạn điền vào 20 byte bị thiếu với số không.

Để tránh điều này, f.seek(0) trước khi viết lại.

1

f.truncate(0) đặt tất cả byte của tệp thành \x00. Tuy nhiên, nó không thay đổi con trỏ tập tin - bạn vẫn ở vị trí sau cuộc gọi đến read. Do đó, nếu bạn viết bất cứ điều gì, hệ điều hành sẽ mở rộng tệp đến độ dài mới (độ dài ban đầu + len(data)).

Để tránh điều đó, hãy gọi seek:

with open('File.txt', 'r+') as f: 
    data=f.read() 
    f.seek(0) 
    f.truncate(0) 
    f.write(data) 
+0

Không, không, không. '.truncate' cắt ngắn tệp. Đó là nó; không có byte trống. Nếu mã kết thúc bằng 'f.truncate (0)', thì tệp sẽ trở thành không có kích thước. Đó là '.write' trên một tệp offset khác với 0 làm cho hệ điều hành điền vào các byte * không được phép * với các byte rỗng (hoặc chỉ * giả định * rằng các byte không được phép là null; nó phụ thuộc vào hệ thống tệp). – tzot

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