我有一个FASTA文件,在“description”行中有三个已定义的元素。
定义为dato[0]
的第一个元素是必须执行条件的元素,定义为dato[2]
的第三个元素是我想要求和的元素。
FASTA描述行是这样的:
PIN4 HOIAQKS02C4SWQ 1761
PIN1 HOIAQKS02D3JZ3 572
我希望将在一行中执行条件dato[2]
并在另一行中执行条件dato[0] == PIN1
的值(dato[0] == PIN4
)相加。
我使用以下代码:
from Bio import SeqIO
secuencias=SeqIO.parse("/Users/imac/Desktop/Pruebas_UniFrac/otu1_alpin1+4.fasta", "fasta")
PIN_records=list(SeqIO.parse("/Users/imac/Desktop/Pruebas_UniFrac/otu1_alpin1+4.fasta", "fasta")
archivo1=open("/Users/imac/Desktop/Pruebas_UniFrac/pruebaalpin1+4_fin.fasta", "w")
archivo2=open("/Users/imac/Desktop/Pruebas_UniFrac/pruebaalpin1+4_seqsotus.fasta", "w")
archivo3=open("/Users/imac/Desktop/Pruebas_UniFrac/pruebaalpin1+4_sumas.fasta", "w")
x = 0
y = x+1
for linea in secuencias:
dato = linea.description.split(" ")
seqs = str(linea.seq)
if dato[0] != "PIN1":
if dato[0] != "PIN4":
if dato[0] == "consensus":
archivo1.write("hacia arriba OTU" + str(y) + "\n" + "x" + "\n" + "x" + "\n")
archivo2.write(">" + "OTU" + str(y) + "\n" + seqs + "\n")
archivo3.write("fin del OTU" + "\n")
y = y+1
else:
archivo1.write(str(dato[0]) + "," + str(dato[2]) + "\n")
#num = int(dato[2])
#archivo3.write("PIN4=" + str(sum(dato[2])) + "\n")
#archivo3.write("PIN4=%d\n" % sum(dato[2]))
archivo3.write("PIN4={}\n".format(sum(dato[2])))
else:
archivo1.write(str(dato[0]) + "," + str(dato[2]) + "\n")
#num = int(dato[2])
#archivo3.write("PIN1=" + str(sum(dato[2])) + "\n")
#archivo3.write("PIN1=%d\n" % sum(dato[2]))
archivo3.write("PIN1={}\n".format(sum(dato[2])))
archivo1.close()
archivo2.close()
archivo3.close()
当我这样做时,我收到此错误消息:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
在发表后面的评论后,我已经介绍了我的代码中的更改,但我无法正常工作,我不知道如何解决它。
非常感谢
使用此代码,我收到以下错误:
File "./lectura_msaout_pruebaalpin1+4_final.py", line 16
archivo1=open("/Users/imac/Desktop/Pruebas_UniFrac/pruebaalpin1+4_fin.fasta", "w")
^
SyntaxError: invalid syntax
答案 0 :(得分:0)
您的代码有两个主要问题。
sum()
。您希望对可迭代的数值求和,因为对于字符串值未定义求和。您可以通过在每个值上调用int()
将字符串值转换为整数(使用map()
函数执行此操作)。
>>> sum(["1", "2", "3"])
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> sum([1, 2, 3])
6
map(int, ["1", "2", "3"])
[1, 2, 3]
>>> sum(map(int, ["1", "2", "3"]))
6
你真的想要总结dato[2]
的个位数吗?它看起来像这样:
>>> dato = ['PIN4', 'HOIAQKS02C4SWQ', '1761']
>>> sum(map(int, dato[2])) # 1 + 7 + 6 + 1
15
您不能将整数附加到字符串(请参阅Python String and Integer concatenation)。
解决方案是在连接之前将整数转换为字符串,或者在字符串中格式化整数。在您的情况下,解决方案如下所示:
转换为字符串:
archivo3.write("PIN1=" + str(dato_2_sum) + "\n")
使用字符串格式:
archivo3.write("PIN1=%d\n" % dato_2_sum)
使用newstyle格式:
archivo3.write("PIN1={}\n".format(dato_2_sum)
答案 1 :(得分:0)
最后,我通过在'for'循环之外创建计数器并创建一个总和但没有'sum'命令并在'str'和'int'之间进行更改来解决我的问题。我的“差不多完成”的完整代码如下:
#!/usr/bin/python
from Bio import SeqIO
sequences=SeqIO.parse("/Users/imac/Desktop/Pruebas_UniFrac/otu1_alpin1+4.fasta", "fasta")
file1=open("/Users/imac/Desktop/Pruebas_UniFrac/pruebaalpin1+4_fin.fasta", "w")
file2=open("/Users/imac/Desktop/Pruebas_UniFrac/pruebaalpin1+4_seqsotus.fasta", "w")
file3=open("/Users/imac/Desktop/Pruebas_UniFrac/pruebaalpin1+4_sumas.fasta", "w")
numTotalPin1=0
numTotalPin4=0
x=0
y=x+1
for line in sequences:
data=line.description.split(" ")
seqs=str(line.seq)
if data[0]!="PIN1":
if data[0]!="PIN4":
if data[0]=="consensus":
file1.write("upstream OTU" + str(y) + "\n" + "x" + "\n" + "x" + "\n")
file2.write(">" + "OTU" + str(y) +"\n" + seqs + "\n")
file3.write("OTU"+ str(y) + "\n")
file3.write("PIN1=" + str(numTotalPin1) + "\n")
file3.write("PIN4=" + str(numTotalPin4) + "\n")
file3.write("end of OTU"+ str(y) + "\n")
y=y+1
numTotalPin1=0
numTotalPin4=0
else:
file1.write(str(data[0]) + "," + str(data[2]) + "\n")
num=int(data[2])
numTotalPin4=numTotalPin4 + int(data[2])
else:
file1.write(str(data[0]) + "," + str(data[2]) + "\n")
num=int(data[2])
numTotalPin1=numTotalPin1 + int(data[2])
file1.close()
file2.close()
file3.close()
我希望有人能发现这段代码有用。 谢谢你的帮助。