首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Biopython,我想优化这段代码

使用Biopython,我想优化这段代码
EN

Code Review用户
提问于 2012-08-05 16:09:17
回答 1查看 228关注 0票数 5

我有以下代码:

代码语言:javascript
复制
from Bio import AlignIO
import itertools

out=open("test.csv","a")
align = AlignIO.read("HPV16_CG.aln.fas", "fasta")
n=0
def SNP(line):  
    result=[]
    result.append(str(n+1))
    result.append(line[0])
    result.append(align[y].id.rsplit("|")[3])
    result.append(x)
    return result



while n<len(align[0]):
  line = align[:,n]
  y=0
  for x in line:
    if line[0]!=x:
      print >> out, ','.join(map(str,SNP(line)))
      y=y+1
    else:
      y=y+1
  y=0
  n=n+1
out.close()

f=open("test.csv","rU")

out=open("test_2.csv","a")
lines=f.read().split()

for key, group in itertools.groupby(lines, lambda line: line.partition(',')[0]):
    print >>out, ','.join(group)

out.close()
f.close()

如您所见,我目前正在编写两个文件。我只需要第二个文件。有没有人建议把两个“下标”合并成一个?

输入文件"HPV16_CG.aln.fas“如下所示:

代码语言:javascript
复制
>gi|333031|lcl|HPV16REF.1| Alpha-9 - Human Papillomavirus 16, complete genome. 
ACTACAATAATTCATGTATAAAACTAAGGGCGTAACCGAAATCGGTTGAACCGAAACCGG

>gi|333031|gb|K02718.1|PPH16 Human papillomavirus type 16 (HPV16), complete genome
ACTACAATAATTCATGTATAAAACTAAGGGCGTAACCGAAATCGGTTGAACCGAAACCGG

>gi|196170262|gb|FJ006723.1| Human papillomavirus type 16, complete genome
ACTACAATAATTCATGTATAAAACTAAGGGCGTAACCGAAATCGGTTGAACCGAAACCGG

我真的很感激所有的帮助/建议,以帮助我改善这一点!

EN

回答 1

Code Review用户

发布于 2012-08-05 19:20:45

首先,阅读PEP8 (全部!)并坚持下去。这是Python代码的事实上的标准。

在下面的文章中,我将默认假定为PEP8。

其次,如果您实际编写了预期的输出,这将有所帮助。给定输入文件,脚本生成空输出。

我不明白while循环应该做什么。align表示单个对齐记录--您正在读取包含多个序列的序列文件。此外,什么是align[:, n]?您是否打算访问seq子对象?

同样,SNP方法根本没有说明它的功能是什么。它隐含地使用全局变量。这是容易出错和不可读的:使用参数代替。该函数还访问一些对象align[y],这在y > 0时不存在,因为AlignIO.read只读取单个对齐。

此外,如果您正在处理CSV文件,我强烈建议使用csv模块。在您的特定情况下,它并不是真正较少的代码,但它提供了更统一的处理方式,并使代码易于扩展。

为了展示清洁后的效果,下面是第一个文件的生成。我很想展示完整的代码,但我真的不明白这段代码应该做什么,因为它对我不起作用,而且我不熟悉align[:,n]的函数(而且我认为访问align有一个错误。

代码语言:javascript
复制
#!/usr/bin/env python

import csv
import itertools
import sys
from Bio import AlignIO


def snp(line, alignment, n, base, pos):
    """Documentation missing!"""
    id = alignment[pos].id.rsplit('|')[3] # why rsplit?
    return [ str(n + 1), line[0], id, base ]


def main():
    # TODO Use command line argumnents to provide file names

    alignment = Bio.AlignIO.read('HPV16_CG.aln.fas', 'fasta')

    with csv.writer('test.csv') as out:
        for n in range(len(alignment[0])):
            line = align[ : , n]
            for pos, base in line:
                if line[0] != x:
                    out.writerow(snp(line, alignment, n, base, pos))


if __name__ == '__main__':
    sys.exit(main())

在这段代码中,我试图给变量取有意义的名字,但是--因为我不知道这应该做什么--我不得不根据用法猜测很多。

顺便说一句,range(len(x))实际上是一种反模式,但我无法记住“正确”的用法(甚至文档也建议这样做)。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/14357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档