在声明之前使用变量

时间:2013-12-19 13:17:08

标签: python conditional-statements declaration

我正在编写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),我不必关闭任何东西!

4 个答案:

答案 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)