我正在编写Python脚本,我遇到了变量声明的问题,这是我脚本的一部分:
if chromosome :
if chromosome.group(1) != '1' :
output.close()
print str(base)+" bases found in chromosome "+chr_name
chr_name = chromosome.group(1)
output = open(current_dir+"/"+name+"3/"+name+".chr"+chromosome.group(1)+".wig", "w")
output.write("fixedStep chrom=chr"+chromosome.group(1)+" start=1 step=1\n")
正如您所看到的,我在关闭输出之前在代码中创建它,但事实上,这种情况永远不会发生,因为您无法在创建文件之前输入条件。
我可以弄脏东西,在我的状况之前打开一个tmp文件,但那不是很优雅。所以我想知道是否有另一种解决方案让Python开心?
编辑:
if chromosome :
if chromosome.group(1) != '1' :
print str(base)+" bases found in chromosome "+chr_name
chr_name = chromosome.group(1)
with open(current_dir+"/"+name+"3/"+name+".chr"+chromosome.group(1)+".wig") as output:
output.write("fixedStep chrom=chr"+chromosome.group(1)+" start=1 step=1\n")
EDIT2:
以下是算法的概念,也许它可以帮助更好地理解问题:
for line in input do :
chromosome = re.search(something)
if chromosome :
if chromosome != '1' :
ouput.close()
output = open(file+chromosome)
output.write(title)
elif somethingElse :
output.write(somethingElse)
endif
endfor
我想创建不同的文件(file1,file2,file3 ......)。在创建file2之前,我必须关闭file1;在创建file3之前,我必须关闭file2;等...但对于第一个(file1),我不必关闭任何东西!
答案 0 :(得分:5)
您可以使用with
语句,就像这样
with open(current_dir+"/"+name+"3/"+name+".chr"+chromosome.group(1)+".wig", 'w') as output:
output.write("fixedStep chrom=chr"+chromosome.group(1)+" start=1 step=1\n")
您不必担心明确关闭文件。
答案 1 :(得分:1)
你是否想要做这样的事情:
if chromosome :
if chromosome.group(1) != '1' :
print str(base)+" bases found in chromosome "+chr_name
chr_name = chromosome.group(1)
else:
output = open(current_dir+"/"+name+"3/"+name+".chr"+chromosome.group(1)+".wig", 'w')
output.write("fixedStep chrom=chr"+chromosome.group(1)+" start=1 step=1\n")
output.close()
output = open("The next file")
output.write("whatever")
output.close()
或改进文件处理和str.format
而不是添加字符串:
if chromosome :
if chromosome.group(1) != '1' :
print str(base)+" bases found in chromosome "+chr_name
chr_name = chromosome.group(1)
else:
with open({}/{}3/{}.chr{}.wig.format(current_dir,name,name,chromosome.group(1), 'w') as output:
output.write("fixedStep chrom=chr"+chromosome.group(1)+" start=1 step=1\n")
with open("The next file") as output:
output.write("whatever")
答案 2 :(得分:0)
这看起来像是itertools.groupby的候选人:
pattern = re.compile(...)
for chromasome, lines in itertools.groupby(input, key=pattern.search):
with open(filebase + chromosome, 'w') as f:
for line in lines:
...
答案 3 :(得分:0)
我不完全确定你要求的是什么,但我认为你可以用另一个嵌套的if语句轻松解决这个问题。
编辑:今天早上太早,忘了这是Python需要在对象中有东西output = None
for line in input do :
chromosome = re.search(something)
if chromosome :
if chromosome != '1' :
if output != None :
output.close()
output = open(file+chromosome)
output.write(title)
elif somethingElse :
output.write(somethingElse)