验证前一行是否具有与当前行相同的字符串以及另一列的总和值

2024-05-12 17:32:52 发布

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

我要做的是这样的脚本读取当前文件:

chr1,700244,714068,LOC100288069,982
chr1,1568158,1570027,MMP23A,784
chr1,1567559,1570030,MMP23A,784
chr1,1849028,1850740,TMEM52,799
chr1,2281852,2284100,LOC100129534,934
chr1,2281852,2284100,LOC100129534,800
chr1,2460183,2461684,HES5,819
chr1,2460183,2461684,HES5,850
chr1,2517898,2522908,FAM213B,834
chr1,2518188,2522908,FAM213B,834
chr1,2518188,2522908,FAM213B,834
chr1,2518188,2522908,FAM213B,834
chr1,2517898,2522908,FAM213B,834

如果第3列在同一行中重复,则将第4列的值求和,得出该和的平均值。输出应为:

^{pr2}$

我试过这个剧本,但没用。谁能给我点小费吗?在

f1 = open('path', 'r')

reader1 = f1.read()

f3 = open('path/B_Media.txt','wb')

for line1 in f1:

    coluna = line1.split(',')
    chr = coluna[0]
    start = coluna[1]
    end = coluna[2]
    gene = coluna[3]
    valor_B = coluna[4]
    previous_line = current_line
    current_line = line
    gene2 = previous_line[3]
    soma_B2 = previous_line[4]
    soma_de_B = int(valor_B)+int(soma_B2)
    if gene == gene2:
            x += 1
            media_gene = soma_de_B/x
            output = chr + "," + start + "," + end + "," + gene + "," +valor_B+","+media_gene
            f3.write(output)
            f3.flush()
            print output

Tags: outputlineopenvalorf1chr1genef3
1条回答
网友
1楼 · 发布于 2024-05-12 17:32:52

因为你需要知道接下来会发生什么(以逐行阅读的方式说话),我将把阅读和写作分成两个不同的部分。在

另外,^{}-模块可能会派上用场,因为您不必处理任何特殊情况(如文本中的逗号等),而且读/写非常容易。使用with打开文件通常是一个好的做法,因为关闭它是自动处理的。在

现在来看看代码:-)

from __future__ import division
import csv

gene = 3
valor_B = 4

data = []
with open('data.csv', 'r') as readfile:
    reader = csv.reader(readfile)
    for row in reader:
        data.append(row)

values_to_add = []
with open('B_Media.txt','wb') as writefile:
    writer = csv.writer(writefile)

    for i in range(len(data)):
        values_to_add.append(int(data[i][valor_B]))
        # if last row or row is different from previous, write it
        if i == len(data)-1 or data[i][gene] != data[i+1][gene]:
            data[i][valor_B] = sum(values_to_add)/len(values_to_add)
            writer.writerow(data[i])
            values_to_add = []

基本上,它首先读取输入文件中的所有内容并将其放入data。然后,with输出文件,遍历每一行,执行以下操作:

  • 将第4列中的值添加到要写入的值列表中(mabye现在不在这一步中,而是最终写入)
  • 如果我们遇到一条与前一行不同或与最后一行不同的行(我们也需要抓住那一行!),写入输出。如果我们这样做,我们取到目前为止收集的值列表的平均值(至少1个,也许2个或更多)。我们使用sum()/len()计算平均值,并用新值替换相应的列,然后将其写入输出文件。在
  • 如果不是这样的话,什么都不要做!第4列中的值已经在第一步中添加到列表中,所以我们只需提前一步到下一行。在

结果:

^{pr2}$

(您可能认识到from __future__ import division语句,它确保在除法时可以有非整数值,比如834.5

相关问题 更多 >