Errno 24附加到大型CSV文件时打开的文件太多

时间:2018-08-28 09:53:09

标签: python linux csv

我正在从数据库中提取一些有关基因的信息,经过一些修改后将其存储在字典中,并将其附加到CSV文件中。

基因总数为489299,所以最后我将得到一个489299行的csv文件,当我对10000个基因进行测试时,脚本运行平稳,但是在489299的情况下,我得到了错误:

  

OSError:[Errno 24]打开的文件太多:“ output_agrold / Genes.csv”

以下是我正在使用的代码的片段:

# I have batches of Genes
batches = ["Gene1 Gene2...", "Gene11 Gene12..."]
for batch in batches:
    genes_batch_dico = create_genes_info_dico(batch)
    # genes_batch_dico is a List of dictionnaries which has info about genes
    # genes_batch_dico = [{info about gene1}, {info about gene2}, ...]
    for gene_dico in genes_batch_dico:
        # I get info from gene_dico : gene_id, start_pos, end_pos .....
        # here I create the CSV file
        with open(OUTPUT_PATH + '/Genes.csv', 'a') as f:
            w = csv.writer(f, delimiter=',', quoting=csv.QUOTE_ALL, quotechar='\"')
            row = [ gene_id, start_pos, end_pos .... ]
            w.writerow(row)

我检查了CSV文件中的行数,它是52800行。

当我在互联网上查看时,我发现此错误是由于同时打开多个文件(我想我不在这里打开,我的意思是我仅附加/附加到一个文件)并且他们建议使用ulimit -n NUMBER命令修改opene文件的最大数量,因此我将open files从1024增加到4096。但是当行数恰好达到52800时,我仍然遇到相同的错误行。

操作系统:Fedora 28。

1 个答案:

答案 0 :(得分:2)

假设您使用的是Python 3.x,则只需打开CSV文件一次即可进行编写。当前,您为每行写操作都以追加模式打开和关闭它。

满足您需要的更好的伪代码是

import csv
import os

batches = ["Gene1 Gene2...", "Gene11 Gene12..."]

with open(os.path.join(OUTPUT_PATH, 'Genes.csv'), 'w', newline='') as f:
    w = csv.writer(f, delimiter=',', quoting=csv.QUOTE_ALL, quotechar='\"')

    for batch in batches:
        genes_batch_dico = create_genes_info_dico(batch)

        for gene_dico in genes_batch_dico:
            row = [ gene_id, start_pos, end_pos .... ]
            w.writerow(row)

os.path.join()是一种将文件路径的各个部分连接在一起的更安全的方法。

如果您仍在使用Python 2.x,请更改此行:

with open(os.path.join(OUTPUT_PATH, 'Genes.csv'), 'wb') as f: