免费注册 查看新帖 |

Chinaunix

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

求助一个Python脚本的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-23 17:48 |只看该作者 |倒序浏览
本人刚学Python,尝试着写了一个小脚本!没有语法错误,但是运行出来的结果不是我想要的,请大神帮忙指点一下问题出在哪儿!
  首先说一下我这个脚本想达到的目的和我的编写思想,我要处理1TFZ.txt这样一个文件,把里面以‘ATOM’这个字符串开头的行,在不连续的残基编号行与行之间插入‘ter’这个字符作为一行!
  例如 这个是初始文件的截图,氨基酸残基编号299和301之间不是连续的,我要在这两行之间插入‘ter’这个字符串作为一行!
这个是程序运行完之后应该产生的结果,在299和301之间增加了'ter'这一行!
如果后一行的编号跟前一行相等或者比前一行大1就不用管,大于1就插入‘ter’作为一行
  1. #!/usr/bin/python
  2. import re
  3. file1=open('1TFZ.txt','r')
  4. file2=open('1TFZ_breaker.txt','w+')
  5. a=file1.readlines()
  6. i=0
  7. x=0
  8. b=[]
  9. for line in file1.readlines():
  10.         file2.write(line)
  11.         x+=1
  12.         if re.match('^ATOM',line):
  13.                 b[i]=x
  14.                 i+=1
  15.         else:
  16.                 continue
  17. c=file2.readlines()
  18. for j in range(len(b)):
  19.         if not (int(a[b[j+1]-1][23:26])==int(a[b[j]-1][23:26])+1 or int(a[b[j+1]-1][23:26])==int(a[b[j]-1][23:26])):
  20.                 c.insert(j,'ter')
  21. file1.close()
  22. file2.close()
复制代码
思路就是说先把整个文件复制一遍写到1TFZ_breaker.txt这个文件里面,然后匹配'ATOM'开头的行,同时把行数记下来写进b这个列表,然后通过b列表里面的行数以及位移值我来每两行做一次比较,如果后一行的氨基酸残基编号比前一行不是相等或者打1的关系我就插入‘ter’。但是我做出来的文件里面什么都没有,所以想请各位帮帮忙!本人新手,描述的不对的地方或者是有什么低级错误的,请原谅!谢谢大家!并附上初始文件! 1TFZ.rar (62.34 KB, 下载次数: 5)

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
2 [报告]
发表于 2015-03-24 11:54 |只看该作者
本帖最后由 Linux_manne 于 2015-03-24 11:55 编辑

  1. f1 = open('1TFZ.txt','r')
  2. f2 = open('res.txt','w+')
  3. end = 0
  4. for line in f1.readlines():
  5.         if line.startswith('ATOM') and len(line) >= 23:
  6.                 start = int(line[23:26])
  7.                 if start - end == 1:
  8.                         end  = int(line[23:26])
  9.                         f2.write('iter\n')
  10.                 else:
  11.                         end = int(line[23:26])
  12.         f2.write(line)       
复制代码
没怎么调试过 大致就这样吧?

论坛徽章:
0
3 [报告]
发表于 2015-03-25 19:00 |只看该作者
你好!你的脚本对我启发很大啊!思路比我的清晰,也比我的简单!我有时候自己写的东西自己都搅晕了!
我运行了一下你这个脚本,是对的,不过应该是如果没两行残基编号相等或者是大于1的话就不加‘iter’,只有每两行残基编号之差大于1的时候才插入'iter',你的整体程序是对的,思路也是很对的,我只把if那一行修改了一下就变成了我想要的!所以说非常感谢你!
  1. #!/usr/bin/python
  2. f1 = open('1TFZ.txt','r')
  3. f2 = open('res.txt','w+')
  4. end = 0
  5. for line in f1.readlines():
  6.         if line.startswith('ATOM') :
  7.                 start = int(line[23:26])
  8.                 if not (start - end == 1 or start - end == 0):
  9.                         end  = int(line[23:26])
  10.                         f2.write('iter\n')
  11.                 else:
  12.                         end = int(line[23:26])
  13.         f2.write(line)
复制代码
回复 2# Linux_manne


   

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
4 [报告]
发表于 2015-03-26 09:17 |只看该作者
回复 3# wufengxu


    嗯... 追求简单高效...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP