【问题标题】:Making default output file dependent on input file使默认输出文件依赖于输入文件
【发布时间】:2015-02-12 18:09:36
【问题描述】:

我正在尝试制作一个将一种文件类型转换为另一种文件类型的 python 脚本,我希望可以选择指定一个输出文件,但默认情况下只是更改默认文件名的扩展名。

例如:我希望convert('foo.gb') 输出foo.faa,但convert('foo.gb', 'bar.faa') 输出bar.faa

我的实现方式是:

#!/usr/bin/env python

def convert(inputFile, outputFile = None):
    [code that converts data]

    if not outputFile:
        import re
        name = re.match('(.+)\.\w+', inputFile)
        outputFile = './{0}.faa'.format(name.group(1))

    with open(outputFile, 'w+') as outFaa:
        outputFaa.write([stuff to write])

因此,它检查是否指定了输出,如果没有指定,则使用正则表达式更改输入文件名以具有正确的扩展名。这段代码有效,但似乎有些草率,或者至少不是很可读。如果文件名在扩展名之前以外的任何地方都有.,它也会中断,它有时可能会有。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python bash function default-arguments


    【解决方案1】:

    请使用友好人士在您的 Python 安装中提供的电池。看看os.path,尤其是splitext

    那么你可以这样写:

    def convert(filename, changeto=None):
        basename, ext = os.path.splitext(in)
        if changeto is None:
            return basename + ".faa"
        return changeto
    

    在您的应用程序中,您需要注意路径结构。我只想对不包含目录分隔符的文件名使用上面的函数。

    【讨论】:

    • 好的 - 这显然是比正则表达式更好的方法,谢谢。我的问题更多是关于如何处理函数定义中的参数 - 我在这里的方式有意义吗?
    • 请不要在此处复制/粘贴您的 cmets。您的代码中有一个严重错误:with open(outputFile, 'w+') as out:out 定义为文件对象,而您随后调用了outputFile.write()(您甚至没有尝试,因为您会看到这会失败)。不要在变量命名中使用 camelCase,不要在 func 签名中在 = 周围使用空格,使用比 outputFile 更具表现力的变量名称,这实际上只是一个名称。
    • 引入了 错误,因为我试图使代码更通用一点,但错过了那一段。我的版本有效(编辑原件以修复)。很抱歉复制粘贴评论 - 两个答案非常相似,我应该坚持评论在该实例中发布的第一个吗?
    【解决方案2】:
    import os
    
    if output_fname is None:
        basename, ext = os.path.splitext(input_fname)
        output_fname = basename + ".faa"
    

    请参阅https://docs.python.org/3.4/library/os.path.html 的文档

    编辑:还不错;我真正要做的唯一不同的事情是让输出文件名处理函数中的第一件事。这只是让下一个人更容易弄清楚参数的来源以及如何正确使用它们:

    import os
    def convert(in_fname, out_fname = None):
        # start by sanitizing parameters
        if out_fname is None:
            basename, ext = os.path.splitext(in_fname)
            out_fname = basename + ".faa"
    
        # read data
        with open(in_fname) as inf:
            data = inf.read()   # or inf.readlines()
    
        # do conversion
        result = do_conversion(data)
    
        # write result
        with open(out_fname, "w") as outf:
            outf.write(result)  # or .write("\n".join(result))
    

    【讨论】:

    • 好的 - 这显然是比正则表达式更好的方法,谢谢。我的问题更多是关于如何处理函数定义中的参数 - 我在这里的方式有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2015-09-21
    • 1970-01-01
    • 2020-03-20
    • 2014-10-18
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多