每当我的外部for循环迭代时,如何使我的内部for循环进行迭代?

时间:2020-08-18 12:44:14

标签: python

我有两个文件,我试图将第二个文件的最后一列中的字符串追加到包含第一个文件中信息的数组中的数组中。我希望这些字符串仅在第二个文件的第二列中的数字介于第一个文件的第一列和第二列的数字之间时附加。

这是我的文件:

reads.bed:

chromA  10      69      read1
chromA  10      35      read2
chromA  10      55      read3
chromA  15      69      read4
chromA  80      119     read5
chromA  80      111     read6
chromA  90      119     read7
chromA  101     119     read8

feats.bed:

chromA  10      19      feat1
chromA  30      39      feat2
chromA  50      69      feat3
chromA  80      89      feat4
chromA  100     119     feat5

这是我的代码:

feat_bed=open("feats.bed","r")
read_bed=open("reads.bed","r")


read_coords=[]
for line in read_bed.readlines():
    line=line.strip()
    line=line.split("\t")
    read_coords.append([int(line[1]),int(line[2]),str(line[3]),[]])


for read in read_coords:
    for feat in feat_bed.readlines():
        feat=feat.strip()
        feat=feat.split("\t")
        if int(read[1]) > int(feat[1]) >= int(read[0]):
            read[3].append(str(feat[3]))
    print read

我的预期输出是:

[10, 69, 'read1', ['feat1', 'feat2', 'feat3']]
[10, 35, 'read2', ['feat1', 'feat2']]
[10, 55, 'read3', ['feat1', 'feat2', 'feat3']]
[15, 69, 'read4', ['feat2', 'feat3']]
[80, 119, 'read5', ['feat4', 'feat5']]
[80, 111, 'read6', ['feat4', 'feat5']]
[90, 119, 'read7', ['feat5']]
[101, 119, 'read8', []]

相反,我的内部for循环似乎仅在第一次迭代,然后停止,所以我的实际输出是:

[10, 69, 'read1', ['feat1', 'feat2', 'feat3']]
[10, 35, 'read2', []]
[10, 55, 'read3', []]
[15, 69, 'read4', []]
[80, 119, 'read5', []]
[80, 111, 'read6', []]
[90, 119, 'read7', []]
[101, 119, 'read8', []]

我不明白为什么我的内循环在我的外循环的第一次迭代后就停止迭代。如果有人指出我在做什么错,那将非常有帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

之所以会这样,是因为readlines()从文件中的当前位置读取所有行 。因此,在第一次调用readlines之后,文件指针位于文件的末尾,随后对readlines()的所有调用将返回一个空列表。

您想将行预先保存到列表中,例如feat_lines = feat_bed.readlines() ,然后循环访问预先保存的行列表,例如:for feat in feat_lines:

答案 1 :(得分:0)

使用带有标识的内部循环

feat_bed=open("feats.bed","r")
read_bed=open("reads.bed","r")


read_coords=[]
for line in read_bed.readlines():
    line=line.strip()
    line=line.split("\t")
    read = [int(line[1]),int(line[2]),str(line[3]),[]]

    for feat in feat_bed.readlines():
        feat=feat.strip()
        feat=feat.split("\t")
        if int(read[1]) > int(feat[1]) >= int(read[0]):
            read[3].append(str(feat[3]))
    print read