使用python在文件中添加缺少的行

时间:2016-12-19 14:27:37

标签: python file lines missing-data

在编程和python等方面,我是初学者。 如果这是一个简单的问题,那么道歉。

但我有大文件,例如包含这样的行:

10000     7
20000     1
30000     2
60000     3

我想要的是一个包含“缺失”行的文件,如下所示:

10000     7
20000     1
30000     2
40000     0
50000     0
60000     3

由于我正在使用全基因组序列数据,因此文件相当大。第一列基本上是基因组中的位置,第二列是我在该10kb窗口内找到的SNP的数量。但是,我不认为这些信息甚至是相关的,我只想编写一个简单的python代码,它将使用if else语句将这些行添加到文件中。

因此,如果位置与前一行+ 10000的位置不匹配,则写入“缺失行”,否则写入正常出现的行。

我只是预见到一个问题,即连续几行缺失(如我的例子)。 有没有人有这个简单问题的智能解决方案?

非常感谢!

4 个答案:

答案 0 :(得分:1)

我会按照以下方针建议一个程序。你跟踪你最后看到的基因组位置(我猜它会在开始时为0)。然后逐个读取输入文件中的行。对于每一个,您首先输出任何缺失的行(从先前的基因组位置+ 10kb,以10kb步长,到您读过的新行之前的10kb),然后输出您刚读过的行。

换句话说,你错过的一件小事是,当"位置与前一行+ 10000"的位置不匹配时,你应该有一个小循环来产生缺失输出,而不是只写出一行。 (在您真正开始编写代码之前,以下注释可能没有意义:您实际上不需要测试位置是否匹配;如果您正确编写,您会发现当它与您的循环输出匹配时没有额外的行)

出于各种原因,这里通常的做法是不为你编写代码:-),但我希望上面的内容有所帮助。

答案 1 :(得分:1)

from collections import defaultdict

d = defaultdict(int)
with open('file1.txt') as infile:
    for l in infile:
        pos, count = l.split()
        d[int(pos)] = int(count)

with open('file2.txt') as outfile:
    for i in range(10000, pos+1, 10000):
        outfile.write('{}\t{}'.format(i, d[i]))

这是一个快速版本。我们将文件读入defaultdict。当我们稍后访问这些值时,任何没有关联值的键都将获得默认值零。然后,我们将10000pos范围内的每个数字都取消,其中pos是第一个文件中的最后一个位置,以10000为步长。我们在defaultdict中访问这些值并将它们写入第二个文件。

答案 2 :(得分:1)

这个怎么样:

# Replace lines.txt with your actual file
with open("lines.txt", "r") as file:
    last_line = 0
    lines = []
    for line in file:
        num1, num2 = [int(i) for i in line.split("\t")]
        while num1 != last_line + 10000:
            # A line is missing
            lines.append((last_line + 10000, 0)) 
            last_line += 10000
        lines.append((num1, num2))
        last_line = num1
    for num1, num2 in lines:
        # You should print to a different file here
        print(num1, num2)

您可以将值写入新文件,而不是最后一个print语句。

编辑:我在此示例上运行了此代码。输出如下。

<强> lines.txt

10000   7
20000   1
30000   2
60000   3

<强>输出

10000 7
20000 1
30000 2
40000 0
50000 0
60000 3

答案 3 :(得分:1)

我会使用defaultdict作为默认值使用0 因此,您将文件读取到此defaultdict而不是读取它(手动处理键)并将其写回文件。

看起来有点像这样

from collections import defaultdict

x = defaultdict(int)
with open(filename) as f:
    data = x.split()
    x[data[0]] = x[data[-1]]

with open(filename, 'w') as f:
    for i in range(0, max(x.keys())+1, 10000):
        f.write('{}\t{}\n'.format(i, x[i]))