如何将字典存储为单独的文件,并在python脚本中读取文件以使用变量

时间:2017-08-21 18:17:19

标签: python dictionary

我想帮助使用python打开文件并将文件内容用作变量。 我有一个看起来像这样的脚本。

#!/usr/bin/env python

with open("seqnames-test1-iso-legal-temp.txt") as f:
    gene_data = {'ham_pb_length':2973, 'ham_pb_bitscore':5664,'cg2225_ph_length':3303, 'cg2225_ph_bitscore':6435,'lrp1_pf_length':14259, 'lrp1_pf_bitscore':28010,}
    for line in f:
            if not line.isspace():
                    bitscore = gene_data[line.rstrip()+'_bitscore']
                    length = gene_data[line.rstrip()+'_length']
                    if (2*0.95*length <= bitscore/2 <= 2*1.05*length):
                            print line

文件&#34; seqnames-test1-iso-legal-temp.txt&#34;是一个基因名称列表ham_pb,cg2225,lrp1_pf等。我只包括字典的前6个值,但它总共有600个键。每个形式的名称&#39; _length,&#39; name&#39; _bitscore用于文件中的300个基因名称&#34; seqnames-test1-iso-legal-temp.txt&#34;。

出于这个原因,我想将字典gene_data保存为单独的文本文件,并在执行脚本时读取该文件。有没有办法做到这一点。我试着制作一个文本文件&#34; gene_data1.txt&#34;那只是包括字典。因此,文本文件的内容是:

gene_data = { 'ham_pb_length':2973, 'ham_pb_bitscore':5664,'cg2225_ph_length':3303, 'cg2225_ph_bitscore':6435,'lrp1_pf_length':14259, 'lrp1_pf_bitscore':28010,}

我尝试使用open函数打开文件,所以我的脚本看起来像这样:

#!/usr/bin/env python
gene_data = open("gene_data1.txt", "r")
with open("seqnames-test1-iso-legal-temp.txt") as f:
    for line in f:
            if not line.isspace():
                    bitscore = gene_data[line.rstrip()+'_bitscore']
                    length = gene_data[line.rstrip()+'_length']
                    if (2*0.95*length <= bitscore/2 <= 2*1.05*length):
                            print line

但这只是给了我错误信息:

Traceback (most recent call last):
  File "fixduplicatebittest1.py", line 6, in <module>
    bitscore = gene_data[line.rstrip()+'_bitscore']
NameError: name 'gene_data' is not defined

是否有一种简单的方法来制作这个脚本?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您可以替换此行: gene_data = open("gene_data1.txt", "r")

用这个:

import ast

with open('dict.txt') as f:
    gene_data = f.read()
gene_data = ast.literal_eval(gene_data)

但请确保文本文件只包含字典,而不是字典的分配:

{ 'ham_pb_length':2973, 'ham_pb_bitscore':5664,'cg2225_ph_length':3303, 'cg2225_ph_bitscore':6435,'lrp1_pf_length':14259, 'lrp1_pf_bitscore':28010,}

正如其他人所指出的,允许你的脚本执行文件中的任何命令都是危险的。使用这种方法,至少它不会在外部文件中执行任何操作,如果内容不能很好地评估,脚本只会抛出错误。

答案 1 :(得分:2)

execfileimport可让您在文件中以文本形式运行它。但请注意安全隐患。 import使您可以更好地控制执行过程,但代价是更复杂的语法。

答案 2 :(得分:2)

最简单的方法是将字典放在自己的.py文件中,然后像任何其他模块一样导入它。

<div class = "col-md-12 text-center" >

然后你就可以像在导入模块中输入它一样使用它。

如果您不控制数据文件,这是非常不安全的。