代码之家  ›  专栏  ›  技术社区  ›  Ariyan

如何在文件的特定位置插入而不是覆盖[复制]

  •  0
  • Ariyan  · 技术社区  · 8 年前

    我试图使用以下命令在文件的特定位置插入一些文本:

    with open("test.txt","r+") as f:
        f.seek(5)
        f.write("B")
    

    但这会用新数据(“B”)覆盖位置5处的字符,而不是插入它。

    例如,如果我有

    AAAAAAAAAA
    

    在文件中 test.txt 然后运行代码 AAAAABAAAA AAAAABAAAAA A 必须在之后 B )

    如何在文件的所需位置插入而不是覆盖?

    3 回复  |  直到 8 年前
        1
  •  1
  •   George Shuklin    8 年前

    1. 通用文件API(您在所有操作系统上都希望使用的API)没有用于“插入”的接口(阅读:这是不可能的)
    2. https://lwn.net/Articles/629965/ . ext4和XFS文件系统支持它,并且它需要对fd(e.f.)执行一些低级操作 open 对于python)。此外,正如我查到的(2018年9月)a fallocate FALLOC_FL_INSERT_RANGE ioctl公司。

    如果文件很小,请将其读入内存并插入内存。如果你的文件是中等大小(1-2Gb)做它在临时文件和重命名之后。如果文件很大,请使用窗口操作或向下搜索 法洛-弗勒-插入范围

        2
  •  1
  •   Sruthi    8 年前

    这对我有用:

    with open("test.txt","r+") as f:
        f.seek(5) #first fseek to the position
        line=f.readline() #read everything after it
        f.seek(5) #since file pointer has moved, fseek back to 5
        f.write("B") #write the letter
        f.write(line) #write the remaining part
    
    Original : AAAAAAAAAA
    
    After :    AAAAABAAAAA 
    
        3
  •  1
  •   wailinux    8 年前
    f1 = open("test.txt","r+")
    f1.seek(5)
    data = "{}{}".format("B",f1.readline())
    f1.seek(5)
    f1.write(data)
    f1.close()