我想用两个for循环找到两个txt文本中某列数值相近的列可是只跑了一下就停止了
%%timez=0
i=0
dictcvrcvs={}
chr1 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_R-48h/c vs Rresult.txt', 'r')
chr2 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_S-48h/c vs Sresult.txt', 'r')
for Line1 in chr1.readlines():
try:
line1 = Line1.strip().split('\t')
for Line2 in chr2.readlines():
try:
line2=Line2.strip().split('\t')
if (abs(int(line1)-int(line2))<50) and (line1==line2):
dictcvrcvs]=line1
i+=1
break
except IndexError:
z+=1
continue
except IndexError:
z+=1
continue
dictcvrcvs
{'chr11': '3125133'}
按理说应该有很多怎么会停了呢t 你的代码的问题是,在遍历文件1每一行的时候,文件2都会readlines()一次,但是除了第一次,后面由于指针问题都是空的,解决方法很简单,把文件2的readlines()先赋值给一个变量,然后对这个变量进行迭代:
%%time
z=0
i=0
dictcvrcvs={}
chr1 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_R-48h/c vs Rresult.txt', 'r')
chr2 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_S-48h/c vs Sresult.txt', 'r')
chr1_lines=chr1.readlines() #先把结果赋值给变量,1号文件不是必须,但是为了统一整齐……
chr2_lines=chr2.readlines() #这个是必须的,不能每次循环都做一次这个动作
chr1.close() #内容都导出来了,记得关文件
chr2.close()
for Line1 in chr1_lines:
try:
line1 = Line1.strip().split('\t')
for Line2 in chr2_lines: #对列表进行迭代,就不会有空的了
try:
line2=Line2.strip().split('\t')
if (abs(int(line1)-int(line2))<50) and (line1==line2):
dictcvrcvs]=line1
i+=1
break
except IndexError:
z+=1
continue
except IndexError:
z+=1
continue
因为里层循环中的readlines使用一次后文件指针已经指向末尾,其实chr2再用readlines读出的是None BngThea 发表于 2020-4-10 14:39
因为里层循环中的readlines使用一次后文件指针已经指向末尾,其实chr2再用readlines读出的是None
我把这个删了也不行啊,我感觉还是这个指针的问题,现在我还没有太明白,那怎么改一下可以呢?用feek(0)?
%%time
z=0
i=0
dictcvrcvs={}
chr1 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_R-48h/c vs Rresult.txt', 'r')
chr2 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_S-48h/c vs Sresult.txt', 'r')
for Line1 in chr1:
try:
line1 = Line1.strip().split('\t')
for Line2 in chr2:
try:
line2=Line2.strip().split('\t')
if (abs(int(line1)-int(line2))<10000) and (line1==line2):
dictcvrcvs]=line1
i+=1
break
except IndexError:
z+=1
continue
except IndexError:
z+=1
continue
chr1.close()
chr2.close()
郭书宇 发表于 2020-4-10 14:46
我把这个删了也不行啊,我感觉还是这个指针的问题,现在我还没有太明白,那怎么改一下可以呢?用feek(0 ...
把它单独读出来,再去遍历 txxcat 发表于 2020-4-10 14:34
你的代码的问题是,在遍历文件1每一行的时候,文件2都会readlines()一次,但是除了第一次,后面由于指针问 ...
可是这个有没有别的好方法,感觉这个代码效率太低了 BngThea 发表于 2020-4-10 14:52
把它单独读出来,再去遍历
sorry我把最佳答案给人家了,毕竟咱俩认识给人家脸生的了,我其实看你答案跑出来了,有没有改进一下这个代码的方法,这个感觉跑的好慢 郭书宇 发表于 2020-4-10 15:57
可是这个有没有别的好方法,感觉这个代码效率太低了
看样子你的两个文件都不小,所以运行起来速度不快,看你的代码,每行内容的第一部分不会重复,所以你可以把文件2的数据先转成字典,这样查找起来比遍历一遍列表要快很多。 txxcat 发表于 2020-4-10 16:22
看样子你的两个文件都不小,所以运行起来速度不快,看你的代码,每行内容的第一部分不会重复,所以你可以 ...
我明白你的意思啦=了,可是字典为啥比列表快呢 郭书宇 发表于 2020-4-10 17:16
我明白你的意思啦=了,可是字典为啥比列表快呢
百度了一下:
因为字百典是通过键来索引的,关联到相对的值,理论上他的查询复杂度是O(1)。
哈希表(也叫散列表),根据关度键值对(Key-value)而直接进行访问的数据结知构。它通过把key和value映射到表中一个位置来访问记录,这种查询速度非常快,道更新也快。而这个映射函数叫做哈回希函数,存放值的数组叫做哈希表。答 哈希函数的实现方式决定了哈希表的搜索效率。 txxcat 发表于 2020-4-10 17:44
百度了一下:
因为字百典是通过键来索引的,关联到相对的值,理论上他的查询复杂度是O(1)。
哈希表(也 ...
哦明白了,我确实拿那个跑了一下,字典确实快了很多,一会就能出结果了
页:
[1]