如何在Python中查找特定文件

如何在Python中查找特定文件,python,regex,string,Python,Regex,String,我有一个包含以下结构文件的目录 A2ML1_A8K2U0_MutationOutput.txt A4GALT_Q9NPC4_MutationOutput.txt A4GNT_Q9UNA3_MutationOutput.txt ... 前几个字母代表基因,后几个字母代表Uniprot编号(唯一的蛋白质标识符)和突变输出是不言自明的 在Python中,我希望执行以下行: f_outputfile.write(mutation_directory + SOMETHING +line[1+i]+"_M

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

A2ML1_A8K2U0_MutationOutput.txt
A4GALT_Q9NPC4_MutationOutput.txt
A4GNT_Q9UNA3_MutationOutput.txt
...
前几个字母代表基因,后几个字母代表Uniprot编号(唯一的蛋白质标识符)和突变输出是不言自明的

在Python中,我希望执行以下行:

f_outputfile.write(mutation_directory + SOMETHING +line[1+i]+"_MutationOutput.txt\n")
这里,
行[1+i]
正确地标识了Uniprot ID

我需要做的是正确识别基因名。因此,我需要快速搜索该目录,在uniprot字段中找到包含
行[I+1]
值的文件,然后取出基因名

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

整个目录大约有8116个文件——所以没有那么多

谢谢你的帮助

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

想一想在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
在Python中,您可以使用模块执行完全相同的操作:

当然,您可以将其封装在一个函数中:

>>> 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
是通过使用简单的通配符模式生成正则表达式来实现的,但您不必担心这一点。

您可以使用glob

In [4]: import glob

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

In [6]: files
Out[6]: ['A4GNT_Q9UNA3_MutationOutput.txt']
这里有一个很好的起点:
In [4]: import glob

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

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