2015-09-05 168 views
-2

我写了下面的代码,但出现错误:名称'acc'未定义。我如何解决它?错误:未定义变量名称

import csv 

    with open(r"C:\Users\garfield\Python27\trial.txt") as file,  open(r"C:\Users\garfield\Python27\outp.csv", "a+") as f: 
x=file.read() 
m=x.split() 
writer = csv.writer(f, delimiter =",",quoting=csv.QUOTE_MINIMAL) 
for i in range(len(m)-1): 
    if "ACCESSION" in m[i]: 
     acc=m[i+1] 
    if '/host' in m[i]: 
     host1=m[i].split('/host')[1].split('\n')[0] 
     host2=m[i+1] 
     host=host1+" "+host2 
    if "5'UTR" in m[i]: 
     utr=m[i+1] 
    data=[acc,host,utr] 
    writer.writerow(data) 
+1

您应该发布一个MCVE,以便人们可以重现您的问题。但要确保'acc'被定义为导致'data = [acc,host,utr]'的所有路径。 – juanchopanza

+0

您是否试图将单行写入csv? –

+0

你正在做一些奇怪的事情。你阅读整个文件然后分割它。这可能不会做你想做的事情。然后你用'if'检查这三个字符串,但是如果在第一个'm [i]'中找不到它们中的任何一个,你会得到这个错误。即使你没有,我也不确定这是你想要的,因为这些值将一直存在,直到找到另一个字符串(如果你使用字符串作为标志,这是有意义的)。 –

回答

0

从您的代码看起来,你正试图解析完整的文件,从中创建acc/utr/host变量,然后将它写入到CSV,对我来说,它看起来像你想写什么是一个单一的行中的CSV,完整inputfile中后作为被处理,如果是的话,对于线压痕 -

data=[acc,host,utr] 
writer.writerow(data) 

是错误的,它应在for循环外被缩进,不里面示例 -

for i in range(len(m)-1): 
    if "ACCESSION" in m[i]: 
     acc=m[i+1] 
    if '/host' in m[i]: 
     host1=m[i].split('/host')[1].split('\n')[0] 
     host2=m[i+1] 
     host=host1+" "+host2 
    if "5'UTR" in m[i]: 
     utr=m[i+1] 
writer.writerow([acc,host,utr])   #there is no need for an extra variable here. 

此外,您应该为所有三个变量设置一些默认值,以处理在文件中找不到特定行的情况。