【问题标题】:open multiple files saved as dictionary打开保存为字典的多个文件
【发布时间】: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


【解决方案1】:

我们在评论中讨论后,我更新了我原来的答案。

如果要打开多个文件,可以使用上下文管理器ExitStack

这是一个示例代码:

with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]

files 列表中的每个元素都代表您打开的一个文件。

【讨论】:

  • 如果您只是修改原始答案会更好。请记住,删除的答案实际上并没有被删除:拥有 10k+ 代表的任何人都可以看到它们。
  • @OrDuan 我将打开的文件保存在字典中,因为我需要根据实验名称访问它们SeqIO.write(read,exp_files[experiment[0]],'fastq')
  • @Anni 你仍然可以使用你创建的字典。像这样:{exp: stack.enter_context(open(exp+".fastq",'w')) for exp in experiments} 这样你就不必使用close 方法
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多