免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 20505 | 回复: 42
打印 上一主题 下一主题

求助:尝试修改文件中的部分内容出现问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-16 18:36 |只看该作者 |倒序浏览
假如有个文件: file
file 里面有段内容:  old (仅是一个变量,例如内容可以是" chinaunix" )
我想将 old 修改为 new (同old类似,仅为变量)

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

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

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


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

想问下该怎么解决。
实现类似编辑器那样的插入功能。
谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-02-16 18:37 |只看该作者
自己先顶下。

论坛徽章:
0
3 [报告]
发表于 2009-02-16 19:48 |只看该作者
我想这是用pickle的时候了。

论坛徽章:
0
4 [报告]
发表于 2009-02-17 00:02 |只看该作者
你好 白水月
对于非定长纪录通常都是才用读出来再写进去的方式
如果你担心 内存消耗问题那么边读边写的方式, 读一点写一点,不需要在内存中保存全部的内容。
将新的内容写到一个新的文件中去然后再将原文件删除新文件改名。
如果这还不能满足性能要求 那么建议修改文件格式 或者采用数据库

论坛徽章:
0
5 [报告]
发表于 2009-02-17 13:26 |只看该作者
原帖由 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()

论坛徽章:
0
6 [报告]
发表于 2009-02-17 13:45 |只看该作者
原帖由 luffy.deng 于 2009-2-16 19:48 发表
我想这是用pickle的时候了。

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

论坛徽章:
0
7 [报告]
发表于 2009-02-17 14:30 |只看该作者
原帖由 DQP 于 2009-2-17 13:45 发表

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

有没有关系得看是不是用pickle。你当然可以继续在文件里seek

论坛徽章:
0
8 [报告]
发表于 2009-02-17 15:22 |只看该作者

回复 #7 luffy.deng 的帖子

好吧用pickle
那么优点是什么呢?
简单? 如何简单?
高效? 为什么呢? 提高了多少?

论坛徽章:
0
9 [报告]
发表于 2009-02-17 16:55 |只看该作者
原帖由 DQP 于 2009-2-17 15:22 发表
好吧用pickle
那么优点是什么呢?
简单? 如何简单?
高效? 为什么呢? 提高了多少?

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

[ 本帖最后由 luffy.deng 于 2009-2-17 16:56 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-02-17 17:00 |只看该作者
而且两个程序是在不同的系统平台下,比如一个在windows下,一个在linux下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP