读取lin文件行时,名称未定义错误python

2024-09-25 02:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我对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次,所以我知道每个变量行都是一个字符串,这就是为什么我不明白为什么我的测试脚本起作用了,但这一个没有。在

任何帮助都将不胜感激!在


Tags: 文件字符串name脚本line基因lengthexec
2条回答

line由文本文件迭代器生成,它为读取的每一行发出一个新行。在

所以你的表情:

exec("b="+line+"_bitscore")

传递给exec作为:

^{pr2}$

去掉输出就行了

exec("b="+line.rstrip()+"_bitscore")

前提是将以下行移到循环之前,以便声明变量:

ham_pb_length=2973
ham_pb_bitscore=2165
g2225_ph_length=3303
cg2225_ph_bitscore=2278

更好的方法:停止使用exec,使用字典来避免动态定义变量。在

#!/usr/bin/env python作为第一行。请参阅this问题以获得更多解释。在

正如Jean所指出的,exec不是这项工作的合适工具。你应该使用字典,因为它们不那么危险(搜索代码注入),而且字典更容易阅读。下面是一个如何使用python文档中的字典的示例:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

我可以想出一种方法来实现你的目标:

^{pr2}$

这里我利用了一些有用的python特性。在python3中,5/7的计算结果是0.7142857142857143,而不是许多编程语言中典型的0。如果您想在python3中使用整数除法,请使用5//7。此外,在python中,1<2<3的计算结果是True,而{}的计算结果是{},而在许多编程语言中,1<2<3的计算结果为{},这可能会根据编程语言给出错误或结果为{}。在

相关问题 更多 >