所以,我對python很陌生,我不確定我的代碼是否最有效,但是如果有人能向我解釋爲什麼我的腳本會很感激我運行它時返回「名稱未定義」錯誤。我在一個單獨的文件中有300個基因名的列表,每行一個名稱,我想要讀取,並將每行存儲爲一個字符串變量。名稱未定義錯誤python逐行讀取文件時
在腳本中我有一個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
等爲長度和bitscore變量。
本質上,我在這裏要做的是讀取文件「seqnames-test1-iso-legal-temp.txt」的第1行,它是ham_pb。然後,我想用exec函數創建一個變量b = ham_pb_bitscore和l = ham_pb_length,這樣我就可以測試該基因位數值的一半值是否在其長度的兩倍範圍內,並具有5%的誤差範圍。然後,對每個基因,即文件「seqnames-test1-sio-legal-temp.txt」的每一行重複此操作。
當我執行該腳本,我得到錯誤信息:
Traceback (most recent call last):
File "duplicatebittest.py", line 4, in <module>
exec("b="+line+"_bitscore")
File "<string>", line 1, in <module>
NameError: name 'ham_pb' is not defined
我又簡短的腳本,以確保我使用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'包含行結束符。你必須使用'line.rstrip()' –
因此,澄清,如果第2行被換成'for line.rstrip()in f'? – Louis
沒有。看到我的答案(並接受它,如果它適用於你) –