我正在从数据库中提取一些有关基因的信息,经过一些修改后将其存储在字典中,并将其附加到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。
答案 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: