python可以对文本文件进行部分修改么?

chenthec 2010-08-13 01:36:09
已存的文本文档,只是想加入一些字符而已,不想把全部文本读进来修改再全部输出..

我试用r+打开,然后seek到要修改的位置,但保存后修改还是出现在文件末尾...

请问高手,可以像我需要的那样在原有文本中进行部分修改吗?
...全文
711 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenthec 2010-08-13
  • 打赏
  • 举报
回复
可是我现在f.seek(-len(eachline),1)再writelines没法正常替换文本啊...
angel_su 2010-08-13
  • 打赏
  • 举报
回复
是在行的末尾,不过像原先f.seek(-len(eachline),1)这样移动能正常,注意不同平台下文件换行符问题可能要修正,自己试试吧。
其实用seek适合2进制文件操作,文本应该限于替换。像你增加换行符,那么重写第二段就会发生覆盖同下行又粘在一起了...
chenthec 2010-08-13
  • 打赏
  • 举报
回复
每读取一行就进行操作,这时seek_cur的位置不是应该在这一行的末尾么?
angel_su 2010-08-13
  • 打赏
  • 举报
回复
for line in f遍历方式SEEK_CUR就被置于尾部,个人理解这种情况下是不用seek/tell之流。用的场合都是自己弄个像while循环,然后read/readline读取一部分进行过滤操作,必要时修正位置后再继续循环....
chenthec 2010-08-13
  • 打赏
  • 举报
回复
n=1
f=open('1.txt','r+')
for eachline in f:
if len(eachline)>26:
print 'Line %d > 26' % n
f.seek(-len(eachline),1)
f.writelines('%s%s%s' % (eachline[:26],'\n',eachline[26:len(eachline)-1]))
n+=1
else:
print 'DONE'


这个小脚本是想行行遍历,如果遇到长于26字符的行就插入一个换行符

运行后原有的文本没有被修改,而文件最后被加入了一大段无关的东西...好像是某个模块的内容... = =
angel_su 2010-08-13
  • 打赏
  • 举报
回复
嗯,忘了说不加减字符仅替换才可以,有增删的话只能行行遍历读入修正后再输出...
iambic 2010-08-13
  • 打赏
  • 举报
回复
“不想把全部文本读进来修改再全部输出”——最正经的途径,为什么你不想?
szh_vic 2010-08-13
  • 打赏
  • 举报
回复
哇~~~好深奥 学习了 呵呵··
I_NBFA 2010-08-13
  • 打赏
  • 举报
回复
文件打开seek = 0, 除非seek了否则用r+不可能追加到文件尾, 而是覆盖seek后的内容.
文件是一个顺序存储结构, 你想实现"随机插入"需要把插入点后的数据读出来然后插入最后再追加回去.
小型文件没必要这么折腾直接整个读写就好了, 大中型文件可以用内存映射, 再大只能优化算法了没别的办法.
angel_su 2010-08-13
  • 打赏
  • 举报
回复
可以的,可能seek写错了跑到文件末尾,上代码看看...
李察德-泰森 2010-08-13
  • 打赏
  • 举报
回复
n=1
f=open('1.txt','r+')
for eachline in f:
if len(eachline)>26:
print 'Line %d > 26' % n
f.seek(-len(eachline),1)
f.writelines('%s%s%s' % (eachline[:26],'\n',eachline[26:len(eachline)-1]))
n+=1
else:
print 'DONE'

红色部分,文件行被修改。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧