免费注册 查看新帖 |

Chinaunix

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

求助:如何删除文本文件中的一行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-25 21:27 |只看该作者 |倒序浏览
注明:不可能用全部读进文件的方式来做,因为所要操作的文本文件太大了。

论坛徽章:
0
2 [报告]
发表于 2010-05-25 22:24 |只看该作者
fileHandle=open("filename",'r')#打开文件
fileList=fileHandle.readlines()#每行都读出,放到列表中
随便怎么操作,append,remove.....
完事后把列表写回文件

至于你说的不读取整个文件....额,有这个功能吗?没听说啊

论坛徽章:
0
3 [报告]
发表于 2010-05-25 23:27 |只看该作者
用迭代的方法应该是不需要全读进内存的吧……
  1. a = open('1.txt')
  2. for line in a:
  3.     print line
复制代码
不行的话,如果知道位置,可以seek到那里删除……

论坛徽章:
0
4 [报告]
发表于 2010-05-26 00:29 |只看该作者
回复 3# jjj137
seek到那里你打算怎么删除?

论坛徽章:
0
5 [报告]
发表于 2010-05-26 01:32 |只看该作者
回复 4# luffy.deng


    嗯,确实啊,没考虑到这点……看来 seek 的方法是不行的了……
    上面说的迭代的办法,如果我没记错的话,应该还是可以用的。

论坛徽章:
0
6 [报告]
发表于 2010-05-26 09:39 |只看该作者
可以一行一行的读,然后往结果文件里面写,不要写要删除的那些行。。。

论坛徽章:
0
7 [报告]
发表于 2010-05-26 10:19 |只看该作者
这个方法应该可以:
为了省事,代码没加异常控制,只写个大概流程

情况1)
知道要删除行的行号:
  1. import os

  2. DELNUM=2     
  3. i=1         
  4. openFileHandle=open('filename','r')
  5. writeFileHandle=open('Temp','w')
  6. while 1:
  7.     line=openFileHandle.readline()
  8.     if line:
  9.         if i==DELNUM:
  10.             i=i+1
  11.             print "找到%d行:%s"%(DELNUM,line)
  12.             continue
  13.         else:
  14.             i=i+1
  15.             writeLine='%s\n'%line
  16.             writeFileHandle.write(writeLine)
  17.     else:
  18.         print "匹配%d行失败,文件已到末尾"%DELNUM
  19.         break
  20. openFileHandle.close()
  21. writeFileHandle.close()
  22. os.remove('filename')
  23. os.rename('Temp','filename')
  24. print "All Done!"
复制代码
代码介绍,从DELNUM行开始:
#要删除行的行号,假设为2
#设个计数器,计录当前到了第几行
#打开要操作的文件
#新建一个中间文件,用于写入除第2行的所有行
#进入主循环
#如果文件没到末尾,并且当前记录的行号不是要删除的行号,将该行写入Temp
#如果是要删除的行,打印行号及该行内容,不写入Temp,进入下一循环
#如果读到文件末尾,跳出主循环
#关闭文件句柄
#用Temp文件替换filename,得到删除了DELNUM行的文件

情况2)
知道要删除行的某一特征:
将1中的行号判断改成正则表达式,匹配成功,不写入Temp
不成功,写入Temp,其他一样

论坛徽章:
0
8 [报告]
发表于 2010-05-26 10:21 |只看该作者
额,我调试程序了,没注意6楼给出思路了

论坛徽章:
0
9 [报告]
发表于 2010-05-26 10:22 |只看该作者
嗯,感觉还是没什么好办法,因为该文件很大,而且一直在动态增加,全部读出来肯定不现实,因为要每小时执行一次,把不合法的数据行从文件中清除出去;
而且不能用存另外一文件的方式,因为该文件是不能动的。

论坛徽章:
0
10 [报告]
发表于 2010-05-26 10:29 |只看该作者
可以一行一行的读,然后往结果文件里面写,不要写要删除的那些行。。。
t6760915 发表于 2010-05-26 09:39



    补充下,如果你一行一行的写文件比较慢可以增加一个列表,把需要写的行append到这个列表中,当这个列表长度大于比如说5000行时,开始往结果文件中写,写完清除下这个列表。如此循环往复,最后等源文件到达最后一行时,再写下结果文件就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP