我有两个文件,我试图将第二个文件的最后一列中的字符串追加到包含第一个文件中信息的数组中的数组中。我希望这些字符串仅在第二个文件的第二列中的数字介于第一个文件的第一列和第二列的数字之间时附加。
这是我的文件:
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', []]
我不明白为什么我的内循环在我的外循环的第一次迭代后就停止迭代。如果有人指出我在做什么错,那将非常有帮助。谢谢。
答案 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