我的argparse const = open选项总是创建空文件吗?

问题描述

我是一名学生,为了练习,我正在创建一个小程序,将.fastq转换为.fasta文件(因此,它基本上删除了一些行)。

我正在尝试使用argparse库实现输入文件和输出文件的典型用户输入。对于输出,我正在尝试三种情况:

  1. 用户将-o outputfilename.fasta放入以自定义名称创建的输出文件
  2. 用户不输入参数,然后将输出打印到标准输出
  3. 用户放置-o而不进行后续操作,那么它应该自己创建一个文件,其名称来自输入.fasta。
#!/usr/bin/python3

import argparse
import re           
import sys          
                
c=1
parser = argparse.ArgumentParser()
parser.add_argument("--input","-i",required=True,dest="inputfile",type=argparse.FileType("r"))
parser.add_argument("--output","-o",dest="outfilename",type=argparse.FileType("w"),nargs="?",default=sys.stdout,const=open('{}.fasta'.format(sys.argv[2]),"w" ))

args = parser.parse_args()

for line in args.inputfile:
        if c==1:
            line=re.sub ("[@]",">",line)
            args.outfilename.write (line)
            c=c+1
        elif c==2:
            args.outfilename.write (line)   
            c=c+1
        elif c==3:
            c=c+1
        else:
            c=1

我正在为第三个选项而苦苦挣扎,因为我的代码现在总是创建额外的文件,但是却是空的。因此,基本上,它始终运行我的const =选项,即使根据手册,它也不应该。

(请注意:我键入-o outfilename.fasta,它会产生文件,再加上输入名称中的一个空文件。我不键入任何参数,而是在命令行中打印它并产生空的inputname文件。我键入-o并生成其中带有正确行的inputfilename.fasta文件)

nargs ='?'。如果可能,将从命令行使用一个参数,并将其作为单个项目产生。如果不存在命令行参数,则将生成默认值。请注意,对于可选参数,还有另外一种情况-选项字符串存在,但后面没有命令行参数。在这种情况下,将产生const的值。

因为我认为open命令可能有问题,所以我尝试了

parser.add_argument("--output",const=argparse.FileType('{}.fasta'.format(sys.argv[2]),"w" ))

(我只是想要另一种不用打开就可以写文件的方式) 而且很奇怪,它只给了我这个错误信息:

回溯(最近通话最近): 在第19行的文件“ ./fastqtofastaEXPANDED.py”中 args.outfilename.write(行) AttributeError:“ FileType”对象没有属性“ write”

当我使用-o参数时。因此,这将告诉我相反的事实,它确实仅在键入-o时才使用const选项,而在其他情况下则不使用(因为其他情况下工作正常,没有额外的文件,也没有错误消息)。 我对为什么使用open参数似乎一直使用const感到困惑。

我觉得解决问题的方法可能是在动作课中,但是我还不能解决这个问题。如果const只是按照手册中所说的:D的方式工作,那还是没有问题的,毕竟它是公开的吗?

感谢您的帮助!

编辑:由于const =可能无法按照我想要的方式工作,因此我创建了此变通方法。 基本上只是说如果值是None,它将打开一个新文件,其名称来自第一个输入的负后缀加上新后缀。 如果有人有更好的解决方案,我仍然愿意改变它:)

parser.add_argument("--output",default=sys.stdout)

args = parser.parse_args()

if args.outfilename==None:
    i=sys.argv[2][:sys.argv[2].rfind(".")]
    args.outfilename=open("{}.fasta".format(i),"w")

#then all the line reading jazz...

if args.outfilename==None:
    args.outfilename.close()

#to close the file,if it was used.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)