因此,我对python非常陌生,我不确定我的代码是否最有效,但如果有人能向我解释为什么我的脚本在运行时返回“name not defined”错误,我将不胜感激。我在一个单独的文件中有一个300个基因名的列表,每行一个名字,我想读取,并将每一行存储为一个字符串变量。在
在这个脚本中,我有一个600个变量的列表。300个变量中的每个名称都有300个标记为name_bitscore和300个标记为name_length的变量。 我想根据条件筛选列表。我的脚本如下:
#!/usr/bin/python
with open("seqnames-test1-iso-legal-temp.txt") as f:
for line in f:
exec("b="+line+"_bitscore")
exec("l="+line+"_length")
if 0.5*b <= 2*1.05*l and 0.5*b >= 2*0.95*l:
print line
ham_pb_length=2973
ham_pb_bitscore=2165
g2225_ph_length=3303
cg2225_ph_bitscore=2278
对于长度和位分数变量。在
基本上,我在这里要做的是读取文件“seqnames-test1-iso-legal”的第1行-温度文本“那是火腿。然后我使用want to use exec函数创建一个变量b=ham_pb_bitscore和l=ham_pb_长度,这样我就可以测试基因的位分数的一半是否在其长度的两倍范围内,误差为5%。然后,对每个基因重复这个步骤,即文件“seqnames-test1-sio-legal”的每一行-温度文本". 在
执行脚本时,会收到错误消息:
^{pr2}$我做了另一个简短的脚本,以确保我正确地使用exec函数,如下所示:
#!/usr/pin/python
name="string"
string_value=4
exec("b="+name+"_value")
print(name)
print(b)
这个返回:
string
4
所以,我知道我可以使用exec在变量声明中包含一个字符串变量,因为b按预期返回4。所以,我不知道为什么我的第一个脚本出错了。在
我测试以确保变量行是一个字符串,方法是输入
#!/usr/bin/python
with open("seqnames-test1-iso-legal-temp.txt") as f:
for line in f:
print type(line)
它返回了线路
<type 'str'>
300次,所以我知道每个变量行都是一个字符串,这就是为什么我不明白为什么我的测试脚本起作用了,但这一个没有。在
任何帮助都将不胜感激!在
line
由文本文件迭代器生成,它为读取的每一行发出一个新行。在所以你的表情:
传递给
^{pr2}$exec
作为:去掉输出就行了
前提是将以下行移到循环之前,以便声明变量:
更好的方法:停止使用
exec
,使用字典来避免动态定义变量。在将
#!/usr/bin/env python
作为第一行。请参阅this问题以获得更多解释。在正如Jean所指出的,exec不是这项工作的合适工具。你应该使用字典,因为它们不那么危险(搜索代码注入),而且字典更容易阅读。下面是一个如何使用python文档中的字典的示例:
我可以想出一种方法来实现你的目标:
^{pr2}$这里我利用了一些有用的python特性。在python3中,}的计算结果是{},而在许多编程语言中,},这可能会根据编程语言给出错误或结果为{}。在
5/7
的计算结果是0.7142857142857143
,而不是许多编程语言中典型的0。如果您想在python3中使用整数除法,请使用5//7
。此外,在python中,1<2<3
的计算结果是True
,而{1<2<3
的计算结果为{相关问题 更多 >
编程相关推荐