我需要做的是正确识别基因名称。因此,不知何故,我需要快速搜索该目录,找到在其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
是通过使正则表达式你的简单通配符模式的实现,但你不必担心。
这里是一个很好的起点:http://stackoverflow.com/questions/3207219/how-to-list-all-files-of-a-directory-in -蟒蛇 – 2014-09-06 03:44:30