2012-03-16 25 views
5

Đây là một câu hỏi lý thuyết như tôi không có một vấn đề thực tế, nhưng tôi đã tự hỏi ...Python - Thay đổi nhỏ để một file lớn

Nếu tôi đã có một tập tin khổng lồ, nói nhiều hợp đồng biểu diễn và tôi muốn thay đổi một byte đơn và tôi biết độ lệch của byte đó, làm thế nào tôi có thể thực hiện điều này một cách hiệu quả? Có cách nào để làm điều này mà không cần viết lại toàn bộ tập tin và chỉ viết một byte?

Tôi không thấy bất kỳ điều gì trong Python tệp api sẽ cho phép tôi ghi vào một khoảng trống cụ thể trong tệp.

+2

http://docs.python.org/library/stdtypes.html#file.seek Bạn đặt vị trí con trỏ bằng cách sử dụng tìm kiếm(), sau đó viết(), sau đó tuôn ra() để lưu thay đổi. – shimofuri

Trả lời

8

Chừng nào bạn không cần phải chèn hoặc xóa byte, bạn có thể mở tập tin trong chế độ "r+", sử dụng phương pháp seek đến vị trí các đối tượng tập tin tại byte để thay đổi và ghi ra một byte.

Có thể hiệu quả hơn khi sử dụng các hoạt động os.open, os.lseek, os.read, and os.write cấp thấp hơn, không thực hiện bất kỳ bộ đệm cấp ứng dụng nào.

Nếu bạn do cần chèn hoặc xóa byte, xin lỗi, bạn không may mắn: không có cách nào để làm điều đó mà không cần viết lại toàn bộ tệp (từ điểm chèn hoặc xóa đầu tiên). Đây là giới hạn của API tệp cấp thấp POSIX (và AFAIK cũng Windows), không phải của Python cụ thể.

+0

Chắc chắn bạn chỉ cần ghi tệp từ điểm chỉnh sửa chứ không phải toàn bộ tệp? – Marcin

+0

Câu trả lời hay. Cảm ơn rất nhiều! Nhưng bạn đã có nghĩa là viết lại "từ điểm của sự thay đổi đầu tiên" chứ không phải là toàn bộ tập tin? Tôi chỉ tham khảo bình luận của bạn từ dưới đây. – fthinker

+0

Vâng, cả hai bạn đều đúng, tôi đã đơn giản hóa một chút. (Kỹ thuật tiêu chuẩn để thay thế một tập tin * nguyên tử * liên quan đến việc tạo một bản sao đầy đủ, vì vậy thường thì mọi người cứ làm như vậy.) – zwol

2

Bạn có thể tìm kiếm() đến một vị trí và viết một byte đơn. Nó sẽ ghi đè lên những gì ở đó, thay vì chèn.

+0

Ah, ok, liên quan đến điều này, nếu tôi muốn chèn? Trong mỗi trường hợp (chèn/thay đổi) toàn bộ tập tin được viết lại hay chỉ là một byte được viết? Hay điều này chỉ phụ thuộc vào fs? – fthinker

+4

Cả Unix (incl. OSX) lẫn Windows (AFAIK) đều cung cấp các cuộc gọi hệ thống để chèn hoặc xóa các byte khỏi một tệp lớn mà không cần viết lại toàn bộ tệp từ điểm thay đổi đầu tiên. – zwol

2

Tìm kiếm vị trí đó trong tệp và viết một byte đơn. Các đối tượng tệp trong Python có phương thức tìm kiếm lấy số nguyên từ một số hằng số:

seek(offset[, whence]) 

Đối số whence là tùy chọn và mặc định là 0 (định vị tệp tuyệt đối); các giá trị khác là 1 (tìm kiếm tương đối so với vị trí hiện tại) và 2 (tìm kiếm liên quan đến phần cuối của tệp).

0

Đây là một hướng dẫn tốt cho những gì có thể muốn làm: http://diveintopython3.ep.io/files.html#read

'tìm kiếm' là phương pháp để tìm ra byte mà bạn muốn. Các cuộc đàm phán liên kết ở trên về cảnh báo bạn cần phải thực hiện

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