2011-06-19 36 views
6

Tôi có tệp lớn (vài GB) với văn bản.chèn chuỗi trong tệp lớn

Ví dụ, nó có văn bản tiếp theo:

Hello, World! 

tôi cần phải chèn chữ "hài hước" tại 5 vị trí, và bù đắp phần còn lại của văn bản:

Hello, funny World! 

Làm thế nào tôi có thể don' t đọc tất cả các tập tin để bù đắp phần còn lại? Hoặc làm thế nào tôi có thể tối ưu hóa hoạt động này?

Cảm ơn.

+0

Tôi giả sử bạn có nghĩa là vị trí 6 (không dựa trên). – tzot

+0

Hmm. Có thể bạn đã hoàn toàn :) –

Trả lời

8

Bạn không thể. Không thể thu nhỏ hoặc mở rộng các tệp văn bản thuần túy ở đầu hoặc giữa tệp nhưng chỉ ở cuối tệp.

+0

Còn về tệp nhị phân thì sao? –

+0

@Rulexec: Giống nhau. Đây là một hạn chế của các hệ thống tập tin thường được sử dụng. –

+0

Phụ thuộc vào định dạng chính xác. –

0

Nếu tập tin của bạn là một vài gigabyte, sau đó có lẽ là giải pháp của tôi sẽ chỉ áp dụng cho hệ điều hành 64-bit:

from __future__ import with_statement 

import mmap, os 

def insert_string(fp, offset, some_bytes): 
    # fp is assumedly open for read and write 
    fp.seek(0, os.SEEK_END) 
    # now append len(some_bytes) dummy bytes 
    fp.write(some_bytes) # some_bytes happens to have the right len :) 
    fp.flush() 
    file_length= fp.tell() 

    mm= mmap.mmap(fp.fileno(), file_length) 
    # how many bytes do we have to shift? 
    bytes_to_shift= file_length - offset - len(some_bytes) 
    # now shift them 
    mm.move(offset + len(some_bytes), offset, bytes_to_shift) 
    # and replace the contents at offset 
    mm[offset:offset+len(some_bytes)]= some_bytes 
    mm.close() 

if __name__ == "__main__": 
    # create the sample file 
    with open("test.txt", "w") as fp: 
     fp.write("Hello, World!") 
    # now operate on it 
    with open("test.txt", "r+b") as fp: 
     insert_string(fp, 6, " funny") 

NB : đây là một chương trình Python 2 trên Linux. YMMV.

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