Python 3.x Python—如何对文件中的行进行排序以匹配另一个文件排序顺序

Python 3.x Python—如何对文件中的行进行排序以匹配另一个文件排序顺序,python-3.x,matching,Python 3.x,Matching,我有两个文件:A和B 文件A以制表符分隔,并具有特定的排序顺序。我想对文件B中的所有行进行排序,以便两个文件中的所有行完全匹配 以下是文件A(已排序的文件)的格式: 以下是文件B(我要排序的文件)的格式: 正如您所看到的,文件B比文件A有更多的信息,这就是为什么我需要匹配排序顺序,以便从文件B中提取重要信息 基本上,我的输出(我们称之为文件C)应该如下所示: #chr #start #end #name #score #str

我有两个文件:A和B

文件A以制表符分隔,并具有特定的排序顺序。我想对文件B中的所有行进行排序,以便两个文件中的所有行完全匹配

以下是文件A(已排序的文件)的格式:

以下是文件B(我要排序的文件)的格式:

正如您所看到的,文件B比文件A有更多的信息,这就是为什么我需要匹配排序顺序,以便从文件B中提取重要信息

基本上,我的输出(我们称之为文件C)应该如下所示:

#chr    #start      #end        #name                     #score #strand  #genechr #genestart #geneend #genename #genescore #genestrand
chr1    161427010   161427243   Larp7-Chip.MACS2_peak_9704  0   .   chr1    161475205   161489360   FCGR2A  0   +
chr1    161423805   161424053   Larp7-Chip.MACS2_peak_9703  0   .   chr1    161475205   161489360   FCGR2A  0   +
chr1    161429385   161429489   Larp7-Chip.MACS2_peak_9705  0   .   chr1    161475205   161489360   FCGR2A  0   +
注意:我无法使用第四列对文件进行匹配和排序。存在多个重复项,因此会导致问题。排序顺序必须与前三列匹配

编辑:为清晰起见,文件A包含人类基因组中增强子区域的信息。文件B具有相同的增强子信息,但具有关于每个增强子区域附近相关基因的额外信息

我想输出一个新文件,该文件包含文件B中的所有信息,但遵循与文件a相同的行顺序。两个文件中的项目数相同

在Python3中可以这样做吗?我对编程很陌生,但如果有人帮我,我应该可以让它正常工作。这也是我在工作中经常做的一件事,所以把这个脚本放在未来会非常棒


谢谢大家!

我假设前6个col足以唯一标识您的记录:

def getKey (x):
  keys = x.split()[0:6]
  keys[4] = float(keys[4])
  return tuple(keys)
rows_of_fileB = dict( [ getKey(r), r] for r in fileB)
for row in fileA:
  print( rows_of_fileB[getKey(row)] )

按什么排序?我不明白顺序…前6列是用来显示增强子区域在人类基因组中的位置。第二组共6列显示了它们附近的相关基因。我想对输出文件进行排序,使其具有与文件A相同的行顺序(前6列相同),但具有文件B中相关基因的信息。我在主要帖子中进行了编辑,试图澄清一点,如果这没有完全帮助的话,我很抱歉。这可能更容易(理解问题也更有用)如果在每个文件格式中指定列的名称。当前,您指的是前三列,它们在两个文件中包含不同的数据。回想一下关系数据库:确定一个候选键。@dhke我同意,我使用的大多数工具都会去掉标题,这就是为什么不包括标题的原因。我已经在原来的帖子中添加了它们。需要注意的是,两个文件中的前三列包含完全相同的数据,只是文件中的顺序不同。因此,文件A中的第1行可能是文件B中的第1000行。这就是为什么我的示例没有显示相同的数据。但是这两个文件中的前六列是相同的。我在第7行得到一个
keyrerror:getKey=lambda x:tuple(x.split()[0:6])rows\u of_fileB=dict([getKey(r),r]代表fileB中的r)代表fileA:print(rows\u of_fileB[getKey(row)])
。这可能是因为我打开的文件不正确。我使用的是
FileA=open(“FileA.txt”)
FileB=open(“FileB.txt”)
。我是python新手,所以这可能不合适。编辑:是的,您认为前6列足以识别记录的假设是正确的。可能文件a中存在一些行,但文件B中没有相应的行(前6列不匹配)。错误消息将给出该行的前6列。嗯,我实际上认为区别可能是文件A的浮点值为0.0,文件B的整数为0。我将修复此问题并重新运行。对于文件A中的输出:3,将打印行更改为
print(“.”。join(row.split()[0:3])+rows\u of_fileB[getKey(row)])
用于写入fileC:
fileC=open('fileC.txt','w')。。。fileC.write(…+'\n')
#chr    #start      #end        #name                     #score #strand  #genechr #genestart #geneend #genename #genescore #genestrand
chr1    161427010   161427243   Larp7-Chip.MACS2_peak_9704  0   .   chr1    161475205   161489360   FCGR2A  0   +
chr1    161423805   161424053   Larp7-Chip.MACS2_peak_9703  0   .   chr1    161475205   161489360   FCGR2A  0   +
chr1    161429385   161429489   Larp7-Chip.MACS2_peak_9705  0   .   chr1    161475205   161489360   FCGR2A  0   +
def getKey (x):
  keys = x.split()[0:6]
  keys[4] = float(keys[4])
  return tuple(keys)
rows_of_fileB = dict( [ getKey(r), r] for r in fileB)
for row in fileA:
  print( rows_of_fileB[getKey(row)] )