Donc, je suis très nouveau sur python et je ne suis pas sûr que mon code est le plus efficace, mais serait toujours très reconnaissant si quelqu'un pouvait m'expliquer pourquoi mon script renvoie l'erreur "nom non défini" lorsque je l'exécute. J'ai une liste de 300 noms de gènes dans un fichier séparé, un nom par ligne, que je veux lire, et stocker chaque ligne comme une variable de chaîne.Nom non défini erreur Python lors de la lecture de fichier ligne par ligne
Dans le script j'ai une liste de 600 variables. 300 variables nommées name_bitscore et 300 nommées name_length pour chacun des 300 noms. Je souhaite filtrer la liste en fonction d'une condition. Mon script ressemble à ceci:
#!/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
etc. pour les variables longueur et bitscore. Essentiellement, ce que j'essaie de faire ici, c'est lire la ligne 1 du fichier "seqnames-test1-iso-legal-temp.txt" qui est ham_pb. Ensuite, j'utilise voulu utiliser la fonction exec pour créer une variable b = ham_pb_bitscore et l = ham_pb_length, afin que je puisse tester si la moitié de la valeur du bitcore du gène est dans la plage de double sa longueur avec une marge d'erreur de 5%. Ensuite, répétez cette opération pour chaque gène, c'est-à-dire chaque ligne du fichier "seqnames-test1-sio-legal-temp.txt".
Lorsque j'exécute le script, je reçois le message d'erreur:
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
J'ai fait un autre script court pour vous assurer que j'utilisais la fonction exec correctement qui ressemble à ceci:
#!/usr/pin/python
name="string"
string_value=4
exec("b="+name+"_value")
print(name)
print(b)
Et cela renvoie:
string
4
Donc, je sais que je peux utiliser exec pour inclure une variable de chaîne dans une déclaration de variable car b renvoie 4 comme prévu. Donc, je ne suis pas sûr pourquoi je reçois une erreur dans mon premier script.
J'ai testé pour vous assurer que la ligne de variable était une chaîne en entrant
#!/usr/bin/python
with open("seqnames-test1-iso-legal-temp.txt") as f:
for line in f:
print type(line)
Et il est revenu la ligne
<type 'str'>
300 fois, donc je sais chaque ligne variable est une chaîne qui C'est pourquoi je ne comprends pas pourquoi mon script de test a fonctionné, mais celui-ci n'a pas fonctionné.
Toute aide serait super appréciée!
'line' comprend la terminaison de ligne. vous devez utiliser 'line.rstrip()' –
Donc, pour clarifier, la ligne 2 doit-elle être remplacée par 'pour line.rstrip() dans f'? – Louis
no. Voir ma réponse (et l'accepter si cela fonctionne pour vous) –