我有以下代码:
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“如下所示:
>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我真的很感激所有的帮助/建议,以帮助我改善这一点!
发布于 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有一个错误。
#!/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))实际上是一种反模式,但我无法记住“正确”的用法(甚至文档也建议这样做)。
https://codereview.stackexchange.com/questions/14357
复制相似问题