在Python中在文件的实际位置写入
我想从一个文件中读取一行,并在这一行的第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))
),不过应该是能正常工作的,除非你的数据文件特别特别大(在这种情况下,你需要分部分处理文件里的数据,并把结果存到另一个文件里,以免覆盖掉你还没处理的数据)。
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)