2010-03-02 37 views
9

Giả sử tôi có tệp nhị phân 12 GB và tôi muốn cắt 8 GB ra khỏi giữa tệp đó. Tôi biết các chỉ số vị trí tôi muốn cắt giữa.Python: cắt một tệp nhị phân rất lớn

Làm cách nào để thực hiện việc này? Rõ ràng 12GB sẽ không phù hợp với bộ nhớ, đó là tốt, nhưng 8GB sẽ không một trong hai ... Mà tôi nghĩ là tốt, nhưng nó xuất hiện nhị phân dường như không thích nó nếu bạn làm điều đó trong khối! Tôi đã thêm 10MB vào một tệp nhị phân mới và có sự gián đoạn trên các cạnh của mỗi đoạn 10MB trong tệp mới.

Có cách nào để thực hiện điều này một cách dễ dàng không?

Trả lời

8

Đây là ví dụ nhanh. Thích ứng khi cần:

def copypart(src,dest,start,length,bufsize=1024*1024): 
    with open(src,'rb') as f1: 
     f1.seek(start) 
     with open(dest,'wb') as f2: 
      while length: 
       chunk = min(bufsize,length) 
       data = f1.read(chunk) 
       f2.write(data) 
       length -= chunk 

if __name__ == '__main__': 
    GIG = 2**30 
    copypart('test.bin','test2.bin',1*GIG,8*GIG) 
+0

Tôi đã làm điều gì đó rất giống với điều này và dường như không thích nó, với nhị phân nếu bạn trích xuất khối dữ liệu ở giữa vì nó cần byte xung quanh của nó để có ý nghĩa? Hmm. Tôi sẽ thử mã của bạn mặc dù cổ vũ. Ngoài ra bạn có nhận được chiều dài và bộ đệm của bạn một cách sai lầm vòng trong dòng cuối cùng của mã của bạn? –

+0

Đó là bắt đầu và chiều dài ... dòng cuối cùng sử dụng mặc định cho bufsize. Tôi không chắc những gì bạn có ý nghĩa bởi "messes lên ở các cạnh". Nếu bạn cần byte xung quanh có thể bắt đầu và chiều dài của bạn là không chính xác? –

+0

Bạn chính xác! Tôi đã làm rối tung bản thân mình, tất cả đều hoạt động ngay bây giờ :) Kích thước bộ đệm tối ưu cho việc truyền tệp là gì? 1MB tốt? –

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