迭代文件并在列表中保留数据-Python

迭代文件并在列表中保留数据-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

我迭代文件1中的行以获得[ID,名称]的列表,然后我有文件2,这是一个长字符串,我想搜索匹配的ID,其格式为(例如,(x66=92428482(x67:82482384285)),(x68=69464))等,其中ID=66,67,68。我试图比较这两个文件,然后用文件1中的名称替换文件2中的相应ID

抱歉,如果这听起来真的很混乱

我遇到的第一个问题是迭代。到目前为止,我有以下几点:

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版本,我不得不做一些更改。然而,从功能上来说,它们是一样的。