如何在Python中查找特定文件

时间:2014-09-06 03:39:59

标签: python regex string

我有一个包含以下结构文件的目录

A2ML1_A8K2U0_MutationOutput.txt
A4GALT_Q9NPC4_MutationOutput.txt
A4GNT_Q9UNA3_MutationOutput.txt
...

前几个字母代表基因,接下来的几个字母代表Uniprot编号(一个独特的蛋白质标识符),MutationOutput是自我解释的。

在Python中,我想执行以下行:

f_outputfile.write(mutation_directory + SOMETHING +line[1+i]+"_MutationOutput.txt\n")

此处,line[1+i]正确识别Uniprot ID。

我需要做的是正确识别基因名称。所以不知何故,我需要快速搜索该目录,在其uniprot字段中找到具有line[i+1]值的文件,然后取出基因名称。

我知道我可以列出目录中的所有文件,然后我可以对每个字符串执行str.split()并找到它。但有没有办法让我更聪明呢?我应该用字典吗?我可以快速进行正则表达式搜索吗?

整个目录大约有8,116个文件 - 所以不是很多。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

  

我需要做的是正确识别基因名称。所以不知何故,我需要快速搜索该目录,找到其中包含行[i + 1]值的文件的uniprot字段,然后取出基因名称。

想想你如何在shell中做到这一点:

$ ls mutation_directory/*_A8K2U0_MutationOutput.txt
mutation_directory/A2ML1_A8K2U0_MutationOutput.txt

或者,如果你在Windows上:

D:\Somewhere> dir mutation_directory\*_A8K2U0_MutationOutput.txt
A2ML1_A8K2U0_MutationOutput.txt

你可以使用glob模块在​​Python中完成同样的事情:

>>> import glob
>>> glob.glob('mutation_directory/*_A8K2U0_MutationOutput.txt')
['mutation_directory/A2ML1_A8K2U0_MutationOutput.txt']

当然,你可以将它包装在一个函数中:

>>> def find_gene(uniprot):
...     pattern = 'mutation_directory/*_{}_MutationOutput.txt'.format(uniprot)
...     return glob.glob(pattern)[0]

  

但有没有办法让我更聪明呢?我应该用字典吗?

是否"更智能"取决于你的使用模式。

如果您每次运行查找数千个文件,那么只读一次目录并使用字典而不是重复搜索肯定会更高效。但是,如果您正在计划,例如,无论如何阅读整个文件,这将比查找它的时间长几个数量级,所以它可能不重要。你知道他们对过早优化的看法。

但是如果你愿意,你可以很容易地用Uniprot号码制作一个字典:

d = {}
for f in os.listdir('mutation_directory'):
    gene, uniprot, suffix = f.split('_')
    d[uniprot] = f

然后:

>>> d['A8K2U0']
'mutation_directory/A2ML1_A8K2U0_MutationOutput.txt'

  

我可以快速进行正则表达式搜索吗?

对于你的简单案例,你不需要正则表达式。*

更重要的是,你要搜索什么?要么你正在进行循环 - 在这种情况下你也可以使用glob - 或者你将不得不建立一个人工巨型字符串来搜索 - 在哪种情况下你可以使用glob。最好只是建立字典。


*事实上,至少在某些平台/实现中,{{1}}是通过从简单的通配符模式中生成正则表达式来实现的,但您不必担心这一点。

答案 1 :(得分:1)

你可以使用glob

In [4]: import glob

In [5]: files = glob.glob('*_Q9UNA3_*')

In [6]: files
Out[6]: ['A4GNT_Q9UNA3_MutationOutput.txt']