迭代文件并在列表中保留数据-Python
我迭代文件1中的行以获得[ID,名称]的列表,然后我有文件2,这是一个长字符串,我想搜索匹配的ID,其格式为(例如,(x66=92428482(x67:82482384285)),(x68=69464))等,其中ID=66,67,68。我试图比较这两个文件,然后用文件1中的名称替换文件2中的相应ID 抱歉,如果这听起来真的很混乱 我遇到的第一个问题是迭代。到目前为止,我有以下几点:迭代文件并在列表中保留数据-Python,python,list,replace,iteration,Python,List,Replace,Iteration,我迭代文件1中的行以获得[ID,名称]的列表,然后我有文件2,这是一个长字符串,我想搜索匹配的ID,其格式为(例如,(x66=92428482(x67:82482384285)),(x68=69464))等,其中ID=66,67,68。我试图比较这两个文件,然后用文件1中的名称替换文件2中的相应ID 抱歉,如果这听起来真的很混乱 我遇到的第一个问题是迭代。到目前为止,我有以下几点: def compare(file1, file2): next(identifiers) newi
def compare(file1, file2):
next(identifiers)
newick = newickfile.read()
x = newick.split("homer")
for bline in identifiers:
id = bline.split()[-1]
tf_name = bline.split()[3]
data = [id, tf_name]
print homer, data # issue 1
问题1:这将只打印最后一行数据,但当我识别时,它将打印字符串x太多次
如何在没有太多或太少迭代的情况下,将两个数据位相互比较
问题2:我基本上想做下面这样的事情,用名称替换ID,这可能吗
if data[0] in homer:
homer.replace(data[1])
编辑:输入文件的外观(部分视图,因为它们很长)
文件-1:
Cell type TF Rank TF Motif P-value Motif_no
meso cebpb 1 CEBP VKATTGCGCAAT 1e-994 1
meso cebpb 2 CEBP:AP1 TTGCAWCA 1.00E-36 2
meso cebpb 3 CTCFL GCCCCCTACTGG 1.00E-16 3
meso cebpb 4 ETS1 GACTTCCTGM 1.00E-15 4
meso cebpb 5 Zfx KAGACGCCGCGC 1.00E-15 5
meso cebpb 6 Rfx5 TTAGWAACAGMC 1.00E-15 6
meso cebpb 7 Zbtb12 GTTAGCGCGTTC 1.00E-13 7
meso cebpb 8 MafA CATGAGTCAGCC 1.00E-13 8
meso cebpb 9 Sox2 ATTGCCTTGCAA 1.00E-13 9
meso cebpb 10 Tcf4 CYTCTCTGCTTT 1.00E-12 10
等等
文件-2:
(homer6:0,(homer10:0,(homer4:0,(homer5:0,(homer7:0,((homer9:0.186282229002538,((((((homer1:0.129121013567978):0):0):0):0):0):0) etc...
需要输出:
(Rfx5:0,(Tcf4:0,(ETS1:0,(Zfx:0,(Zbtb12:0,((Sox2:0.186282229002538,((((((CEBP:0.129121013567978):0):0):0):0):0):0) etc...
等。对于相应的模体编号,它应该非常简单,只需阅读
文件1
,并在每一行上使用str.replace
。下面是使用str.replace
的示例:
>>> foo = 'test'
>>> foo.replace('test', 'Hello World')
'Hello World'
# This will replace EACH instance of 't'.
>>> foo.replace('t', 'X')
'XesX'
# This will return 'test' because foo doesn't contain 'bar'.
>>> foo.replace('bar', 'nothing')
'test'
但是,str.replace
不会重新分配其处理的字符串。所以在上面的例子中,foo
仍然是'test'
以下示例应符合您的目的:
def compare(file1, file2):
# This file SHOULD be one line. But just in case, do a loop anyways.
homer = ''
with open(file2, 'r') as f:
for line in f:
homer += line
with open(file1, 'r') as f:
for line in f:
data = line.split()
# -1 and 3 are indices where the Motif Num and TF are
# located in the list.
homer = homer.replace('homer{}'.format(data[-1]), data[3])
你能清楚地写出文件1的内容和文件2吗?你的意思是我能打印内容吗?是的,你举的例子不清楚。如果你提供文件1和文件2的清晰视图,可能会帮助我解决我认为可能存在的问题。我已编辑以包含这些输入文件的视图。我希望这能让事情更清楚,谢谢!你能解释一下homer99是如何被RFX5取代的吗?你能告诉我这个吗?“荷马+=线”是做什么的?最后一行是如何工作的?谢谢:)行
homer+=line
将file2
的行附加在一起。这是为了防止file2
超过1行。最后一行是用您的TF
名称替换homerXX
的任何实例。我将更新我的答案,以给出一个str.replace
的示例。感谢您的帮助,而且这个解释非常有用!太棒了!!另外,我终于设法让它再次工作了,谢谢:)嘿,我刚刚注意到,虽然它正在用一个TF名称替换荷马{},但它是不正确的,我不知道一些名称来自何处,例如,其中一些甚至不在我的文件1列表中,如“Sox29”。这可能是一个迭代问题,还是它没有将TF与homerID关联?嗯,使用我得到的示例输入。由于代码板上使用的Python版本,我不得不做一些更改。然而,从功能上来说,它们是一样的。