Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python在文件中添加缺少的行_Python_File_Lines_Missing Data - Fatal编程技术网

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

使用python在文件中添加缺少的行,python,file,lines,missing-data,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 我想要的是一个包含“缺失”行的文件,如下所示: 10000 7 20000 1 30000 2 60000

对于编程和python之类的东西,我是个初学者。 如果这是一个简单的问题,我道歉

但我有一些大型文件,例如包含以下行:

10000     7
20000     1
30000     2
60000     3
10000     7
20000     1
30000     2
40000     0
50000     0
60000     3
我想要的是一个包含“缺失”行的文件,如下所示:

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的位置不匹配,则写入“缺失行”,否则写入正常发生的行

我只是预见了其中的一个问题,即当一行中有几行丢失时(如我的示例中所示)。 对于这个简单的问题,有人有聪明的解决方案吗


非常感谢

我建议一个大致如下的计划。你可以跟踪你最后看到的基因组位置(我猜,一开始是0)。然后从输入文件中逐个读取行。对于每一行,您首先输出任何缺失的行(从上一个基因组位置+10kb,以10kb的步骤,到您读取的新行之前的10kb),然后输出您刚刚读取的行

换句话说,您缺少的一点是,当“位置与前一行+10000的位置不匹配”时,您应该有一个小循环来生成缺少的输出,而不是仅仅写出一行。(在您真正开始编写代码之前,以下注释可能毫无意义:您实际上不需要测试位置是否匹配;如果您编写正确,您将发现当它匹配您的循环时,不会输出额外的行)


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

我建议按照以下思路编写一个程序。你可以跟踪你最后看到的基因组位置(我猜,一开始是0)。然后从输入文件中逐个读取行。对于每一行,您首先输出任何缺失的行(从上一个基因组位置+10kb,以10kb的步骤,到您读取的新行之前的10kb),然后输出您刚刚读取的行

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]))
换句话说,您缺少的一点是,当“位置与前一行+10000的位置不匹配”时,您应该有一个小循环来生成缺少的输出,而不是仅仅写出一行。(在您真正开始编写代码之前,以下注释可能毫无意义:您实际上不需要测试位置是否匹配;如果您编写正确,您将发现当它匹配您的循环时,不会输出额外的行)

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

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
。当我们稍后访问这些值时,任何没有关联值的键都将获得默认值零。然后我们取
10000
pos
范围内的每个数字,其中
pos
是第一个文件中的最后一个位置,以
10000
的步骤进行。我们在
defaultdict
中访问这些值,并将它们写入第二个文件

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

这个怎么样:

# 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
输出

10000   7
20000   1
30000   2
60000   3
10000 7
20000 1
30000 2
40000 0
50000 0
60000 3
这个怎么样:

# 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
输出

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

我将使用
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]))

我将使用
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]))

为此,您必须编写代码。这很简单。你自己试试看。在过程中您将面临的任何特定问题;你可以随时回来。现在,将第一个文件读入字典,然后将缺少的数字添加到字典中,然后将字典写入一个文件“因此,如果位置与前一行+10000的位置不匹配,则写入‘缺少的行’,否则写入正常发生的行。”,找到要做的事情。谢谢,我知道我可以更努力地想出我自己的简单代码,但第一行对我来说是初学者,也是最难的。。。我不认为这类问题是离题的,因为有很多像我这样的人在编码的开始阶段遇到了麻烦。对不起,如果我的问题很简单,甚至可能是愚蠢的,但我也在幕后尝试。感谢您的快速回复。为此,您必须编写代码