【发布时间】:2016-10-24 13:57:58
【问题描述】:
用户的输入是实验名称和包含数据的文件。数据处理后,我将文件中的哪个样本(行)保存在一个字典中,对应于哪个实验。 例如,(有时样本可以属于多个实验,或者一个或一个都没有)
exp_sample["sample1"]=['experiment5','experiment6']
exp_sample["sample3"]=['experiment5']
再次(第二次)解析数据文件时,我想将示例行写入相应的实验文件。意思是,在我解析数据文件时,应该打开所有实验文件。我的想法如下:
experiment_files = {exp: open(exp+".fastq",'w') for exp in experiments}
for read in SeqIO.parse(fastq, 'fastq'):
experiment = exp_sample[sample.id]
#if sample belongs only to one experiment
#or sample belongs to two the same experiments
if len(experiment)==1 or (len(exp)==2 and (exp[0]==exp[1]))
SeqIO.write(read,exp_files[experiment[0]],'fastq')
(x.close() for x in experiment_files.values())
我的问题是,打开保存在dict 中的文件然后以这种方式关闭它们是否合法?或者还有其他更聪明的方法吗?
PS。我知道,我可以将样本行保存到相应的实验列表中,然后将所有实验记录写入一个实验文件,但数据文件可以是几个 GB。
【问题讨论】:
-
我认为你应该在
experiments的循环中使用上下文管理器,而不是使用with语句在experiments上迭代两次 -
@OrDuan 我没有在实验上迭代两次,我在数据文件上迭代两次,即 SeqIO.parse(fastq, 'fastq')
-
这样做应该是合法的,尽管在最后使用像这样的生成器表达式,只是为了它的副作用,被认为是一种不好的做法。您可以使用此answer of mine 中显示的内容将其正式化为另一个问题。
-
那个生成器表达式不会做任何事情。等效的列表理解
[x.close() for x in experiment_files.values()]将 工作,但创建一个立即丢弃的列表是不好的做法。只需使用普通的for循环:for x in experiment_files.values(): x.close()
标签: python dictionary bioinformatics biopython