在python中的第n个字节后附加到文件

时间:2013-09-16 23:19:55

标签: python file

我需要在第n个字节后追加而不删除之前的内容。

例如, 如果我有一个文件包含:“Hello World”
我试图将(5)写成“这个”我应该得到 “你好这个世界”

有没有我应该打开文件的模式??

目前我的代码替换了字符
并给出“Hello thisd”

>>> f = open("1.in",'rw+')
>>> f.seek(5)
>>> f.write(' this')
>>> f.close()

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

你无法在文件中insert。通常做的是:

  1. 有两个缓冲区,旧文件和您要添加内容的新文件
  2. 从旧版复制到新版,直到您要插入新内容为止
  3. 在新文件中插入新内容
  4. 继续从旧缓冲区写入新缓冲区
  5. (可选)替换旧文件。
  6. 在python中它应该是这样的:

    nth_byte = 5
    with open('old_file_path', 'r') as old_buffer, open('new_file_path', 'w') as new_buffer:
        # copy until nth byte
        new_buffer.write(old_buffer.read(nth_byte))
        # insert new content
        new_buffer.write('this')
        # copy the rest of the file
        new_buffer.write(old_buffer.read())
    

    现在,Hello this world中必须有new_buffer。在那之后,由你决定是否用新的或用你想做的任何东西覆盖旧的。

    希望这有帮助!

答案 1 :(得分:1)

我认为你想要做的是读取文件,将其分成两个块,然后重写它。类似的东西:

n = 5
new_string = 'some injection'

with open('example.txt','rw+') as f:
    content = str(f.readlines()[0])
    total_len = len(content)
    one = content[:n]
    three = content[n+1:total_len]
    f.write(one + new_string + three)

答案 2 :(得分:1)

您可以使用mmap执行以下操作:

import mmap

with open('hello.txt', 'w') as f:
    # create a test file
    f.write('Hello World')

with open('hello.txt','r+') as f:
    # insert 'this' into that 
    mm=mmap.mmap(f.fileno(),0)
    print mm[:]
    idx=mm.find('World')
    f.write(mm[0:idx]+'this '+mm[idx:])

with open('hello.txt','r') as f:  
    # display the test file  
    print f.read()
    # prints 'Hello this World'

mmap允许您将类似于可变字符串视为一种。但它有局限性,例如切片分配必须与长度相同。您可以在mmap对象上使用正则表达式。

底线,要将字符串插入文件流,您需要读取它,将字符串插入读取数据,然后将其写回。