在Python中在文件的实际位置写入

4 投票
3 回答
5893 浏览
提问于 2025-04-15 13:11

我想从一个文件中读取一行,并在这一行的第n个位置插入一个换行符("\n"),这样比如说一行有9个字符,就能把它变成三行,每行3个字符,像这样:

"123456789" (before)
"123\n456\n789" (after)

我试过这样做:

f = open(file, "r+")
f.write("123456789")
f.seek(3, 0)
f.write("\n")
f.seek(0)
f.read()

-> '123\n56789'

我希望的是,不要替换掉第n个位置的字符,而只是单纯在那个位置插入一个换行符("\n")。

有没有什么办法可以做到这一点?谢谢!

3 个回答

0

你可以把文件想象成一个字符的数组。如果你想在数组中间插入一个新元素,那就得把后面的所有元素都往后移动。

如果文件里是一个“链表”或者“扩展”的字符,那你就可以按照你说的那样做,但那样的话你需要一个特别的编辑器才能顺序查看它。

1
with open(file, 'r+') as f:
    data = f.read()
    f.seek(0)

    for i in range(len(data)): # could also use 'for i, chara in enumerate(data):' and then 'f.write(chara)' instead of 'f.write(data[i])'
        if (i + 1) % 3 == 0:  # could also do 'if i % 3 == 2:', but that may be slightly confusing
            f.write('\n')
        else:
            f.write(data[i])

我觉得这段代码不太符合Python的风格(因为用了range(len(data))),不过应该是能正常工作的,除非你的数据文件特别特别大(在这种情况下,你需要分部分处理文件里的数据,并把结果存到另一个文件里,以免覆盖掉你还没处理的数据)。

(关于with语句的更多信息。)

7

我觉得你现在尝试的方法是行不通的:你需要从你想插入的位置开始,一直读到文件的末尾,然后在你想要的位置写入新的字符,接着再把原来的数据写回去。这种做法在C语言或者任何有类似seek()功能的语言中都是一样的。

另外一种方法是先把文件内容读入一个字符串中,然后使用列表的方法来插入你的数据。

source_file = open("myfile", "r")
file_data = list(source_file.read())
source_file.close()
file_data.insert(position, data)
open("myfile", "wb").write(file_data)

撰写回答