我想帮助使用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
是否有一种简单的方法来制作这个脚本?
非常感谢任何帮助。
答案 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)
execfile
或import
可让您在文件中以文本形式运行它。但请注意安全隐患。 import
使您可以更好地控制执行过程,但代价是更复杂的语法。
答案 2 :(得分:2)
最简单的方法是将字典放在自己的.py文件中,然后像任何其他模块一样导入它。
<div class = "col-md-12 text-center" >
然后你就可以像在导入模块中输入它一样使用它。
如果您不控制数据文件,这是非常不安全的。