我有一个包含以下结构文件的目录
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个文件 - 所以不是很多。
感谢您的帮助!
答案 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']