求助:尝试修改文件中的部分内容出现问题

求助:尝试修改文件中的部分内容出现问题

假如有个文件: file
file 里面有段内容:  old (仅是一个变量,例如内容可以是" chinaunix" )
我想将 old 修改为 new (同old类似,仅为变量)

我百度和google过,在结合自己的尝试:

用 "r+w" 模式打开文件
先找到 old 所在的文件位置,
然后 seek 到那里。
然后 write( new )回去。

不过发现还是有问题,就是——
如果 old 和 new 的长度一样的话,没事;
但是 如果长度不同的话,就会出现问题。
问题主要是 old 比 new 短的时候(长的话,new可以用空格填充),
这时 write( new ) 后,后面的内容就会被覆盖掉。


我所知但是认为不好的办法:
将后面的内容读出来,重新写入去。
但是这样也有个问题,就是文件很大的时候这样做
消耗太多的内存,所以觉得不合适。

想问下该怎么解决。
实现类似编辑器那样的插入功能。
谢谢!
自己先顶下。
我想这是用pickle的时候了。
你好 白水月
对于非定长纪录通常都是才用读出来再写进去的方式
如果你担心 内存消耗问题那么边读边写的方式, 读一点写一点,不需要在内存中保存全部的内容。
将新的内容写到一个新的文件中去然后再将原文件删除新文件改名。
如果这还不能满足性能要求 那么建议修改文件格式 或者采用数据库


QUOTE:
原帖由 luffy.deng 于 2009-2-16 19:48 发表
我想这是用pickle的时候了。

不行的我试过你的方法 但是空格会被吃掉的   \000代表空格但是他的空格会把后面吃掉而不是缩进不知道为什么   

我觉得是因为 程序运行的时候你写的方式比如说你要写个a进去 他里面的光标是 |a|
你要写入abcde 他里面是|abcde|
空格的话必须要 |abcde 才可以 不过不知道怎么搞啦挺麻烦的

import cPickle as p
f=file('test.txt','w')
f.write("123456789\000123456789\000123456789\000123456789")
f.close()
a="9876543210\000"
print a
f2=file('test1.txt','w')
p.dump(a,f2)
f2.close()
f2=file('test1.txt','r')
s=p.load(f2)
f=file('test.txt','r+')
f.seek(20)
f.write(s)
f.close()
f2.close()


QUOTE:
原帖由 luffy.deng 于 2009-2-16 19:48 发表
我想这是用pickle的时候了。

pickle — Python object serialization¶ ??????
怎么看都和搂主的需求没有直接关系
不过是个文件处理


QUOTE:
原帖由 DQP 于 2009-2-17 13:45 发表

pickle — Python object serialization¶ ??????
怎么看都和搂主的需求没有直接关系
不过是个文件处理

有没有关系得看是不是用pickle。你当然可以继续在文件里seek
好吧用pickle
那么优点是什么呢?
简单? 如何简单?
高效? 为什么呢? 提高了多少?


QUOTE:
原帖由 DQP 于 2009-2-17 15:22 发表
好吧用pickle
那么优点是什么呢?
简单? 如何简单?
高效? 为什么呢? 提高了多少?

是不是高效我不知道,但是确实简单。举个简单例子,给你一个这样的字典d={'aa':1,'bb':12345,'cc':'ert'},在程序里修改一下d['bb']的值,然后保存到文件里。其他程序从这个文件里读取这个字典,你打算怎么搞?seek()么?还是改成固定分割符分割的格式(比如逗号)?还是用数据库?

而且两个程序是在不同的系统平台下,比如一个在windows下,一个在linux下。