如何在Biopython的条件下求和

如何在Biopython的条件下求和,python,sum,conditional-statements,biopython,Python,Sum,Conditional Statements,Biopython,我有一个FASTA文件,在“description”行中定义了三个元素 第一个元素(定义为dato[0])是必须使用条件执行的元素,第三个元素(定义为dato[2])是我要求和的元素。 FASTA描述行如下所示: PIN4 HOIAQKS02C4SWQ 1761 PIN1 HOIAQKS02D3JZ3 572 >>> dato = ['PIN4', 'HOIAQKS02C4SWQ', '1761'] >>> sum(map(int, dato[2])) #

我有一个FASTA文件,在“description”行中定义了三个元素

第一个元素(定义为
dato[0]
)是必须使用条件执行的元素,第三个元素(定义为
dato[2]
)是我要求和的元素。 FASTA描述行如下所示:

PIN4 HOIAQKS02C4SWQ 1761
PIN1 HOIAQKS02D3JZ3 572
>>> dato = ['PIN4', 'HOIAQKS02C4SWQ', '1761']
>>> sum(map(int, dato[2]))  # 1 + 7 + 6 + 1
15
我想求一行中执行条件
dato[0]==PIN1
的值(
dato[2]
)与另一行中执行条件
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 

您的代码有两个主要问题

  • 您试图对字符串数据调用
    sum()
  • 您正在尝试将数值格式化为字符串
  • 固定总和 您希望对数值的可数求和,因为字符串值的求和是未定义的。您可以通过对每个值调用
    int()
    (使用
    map()
    函数)将字符串值转换为整数

    例子: 应用到您的代码中 是否确实要将
    dato[2]
    的个位数相加?看起来是这样的:

    PIN4 HOIAQKS02C4SWQ 1761
    PIN1 HOIAQKS02D3JZ3 572
    
    >>> dato = ['PIN4', 'HOIAQKS02C4SWQ', '1761']
    >>> sum(map(int, dato[2]))  # 1 + 7 + 6 + 1
    15
    
    正在修复字符串格式 不能将整数附加到字符串(请参阅)

    解决方案是在连接之前将整数转换为字符串,或者在字符串中格式化整数。在您的案例中,解决方案如下所示:

    PIN4 HOIAQKS02C4SWQ 1761
    PIN1 HOIAQKS02D3JZ3 572
    
    >>> dato = ['PIN4', 'HOIAQKS02C4SWQ', '1761']
    >>> sum(map(int, dato[2]))  # 1 + 7 + 6 + 1
    15
    
  • 转换为字符串:

    archivo3.write("PIN1=" + str(dato_2_sum) + "\n")
    
  • 使用字符串格式:

    archivo3.write("PIN1=%d\n" % dato_2_sum)
    
    archivo3.write("PIN1={}\n".format(dato_2_sum)
    
  • 使用新闻样式格式:

    archivo3.write("PIN1=%d\n" % dato_2_sum)
    
    archivo3.write("PIN1={}\n".format(dato_2_sum)
    

  • 最后,我通过在'for'循环之外创建计数器,创建一个sum,但不使用'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()
    
    我希望有人能发现这段代码很有帮助。
    谢谢你的帮助。

    你有没有试过发送错误消息?我有,但我发现的解决方案不适合我的问题,我想。一些未来的建议:请更明确地说明问题,而不是“它不起作用”。很难准确地判断你的问题是什么。此外,你应该努力做到这一点。西班牙语与英语有很多同源词,但是当你用另一种语言编写代码时,你会失去很多潜在的读者(同样,用西班牙语varnames看到基于英语的语法也很混乱)。当我说“它仍然不起作用”时,我的意思是我仍然和以前一样有问题:“TypeError:不支持的+操作数类型:'int'和'str”. 非常感谢你的建议我仍然有同样的问题,三个选项中的任何一个。我将在回答中复制完整的代码。我已经用我正在使用的全部代码编辑了这篇文章。即使在提出了将整数转换为字符串或在字符串中格式化整数的三个建议之后,它仍然不起作用。我真的不想对dato[2]的单个数字求和,而是对来自不同fasta部分(我的意思是,来自'>'引入的不同数据)的所有dato[2]值求和,如果它们执行一个条件,可能是:>“PIN4”“HOIAQKS02C4SWQ”“1761”>“PIN4”“HOIAQKS02D3JZ3”“572”——>它们都执行“dato[0]==PIN4”的条件,因此我们可以从这两个===>“1761”+“572”=“2333”中求和“dato[2]”。非常感谢,再次对所有序列进行迭代,建立一个记录列表(例如,
    pinu记录
    )这满足了您的要求,然后为每条记录求和索引2。正如您所看到的,我对python非常陌生,我不知道如何做到这一点。我尝试过在许多部分编写列表,但没有得到任何正确的结果。我得到了不同的错误,因为语法错误导致意外的缩进。我将用新的tex编辑我的问题I don’我不想知道你是否能看出我在哪里犯了错误。非常感谢,我对此感到非常困惑。如果你能帮我解决这个问题,这可以节省我工作中的大量时间。非常感谢。