用户输入是实验的名称和包含数据的文件。在数据操作之后,我保存在一个字典中,文件中的样本(行)对应于哪个实验。 例如,(有时样本可以属于多个实验,或者一个或没有)
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。
答案 0 :(得分:0)
我们在评论中讨论后,我更新了原来的答案。
如果要打开多个文件,可以使用上下文管理器ExitStack
来执行此操作。
以下是一个示例代码:
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
files
列表中的每个元素代表您打开的一个文件。