如何在一个条件下求和

2024-03-29 15:48:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

PIN4 HOIAQKS02C4SWQ 1761
PIN1 HOIAQKS02D3JZ3 572

我想求一行中执行条件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 

Tags: 元素usersfastawritesumdesktopstrdato
2条回答

您的代码有两个主要问题。你知道吗

  1. 您正在尝试对字符串数据调用sum()。你知道吗
  2. 您正在尝试将数值格式化为字符串。你知道吗

固定总和

您想要对一个可数的数值求和,因为字符串值的求和是未定义的。通过对每个值调用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)。你知道吗

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

  1. 转换为字符串:

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

    archivo3.write("PIN1=%d\n" % dato_2_sum)
    
  3. 使用newstyle格式:

    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()

我希望有人能发现这个代码有帮助。 谢谢你的帮助。你知道吗

相关问题 更多 >