2014-09-06 42 views
2

我有以下结构如何找到一个特定的文件在Python

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()并找到它。但是有没有办法让我更聪明?我应该用字典吗?我可以只做一个快速的正则表达式搜索吗?

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

谢谢你的帮助!

+0

这里是一个很好的起点:http://stackoverflow.com/questions/3207219/how-to-list-all-files-of-a-directory-in -蟒蛇 – 2014-09-06 03:44:30

回答

2

我需要做的是正确识别基因名称。因此,不知何故,我需要快速搜索该目录,找到在其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,与glob模块:

>>> 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

您可以使用水珠

In [4]: import glob 

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

In [6]: files 
Out[6]: ['A4GNT_Q9UNA3_MutationOutput.txt'] 
相关问题