Python 命令行参数 Try/Except

Python Command Line Arguments Try/Except

我想创建一个接受两个命令行参数的程序。第一个是要打开进行解析的文件的名称,第二个是标志 -s。如果用户提供了错误数量的参数或者另一个参数不是 -s 那么它将打印消息 "Usage: [-s] file_name" 并使用 exit 终止程序。

接下来,我希望我的程序尝试打开文件进行读取。程序应该打开文件读取每一行和 return 每个浮点数、整数和其他非整数或浮点数的字符串的计数。但是,如果打开文件失败,它应该引发异常并打印 "Unable to open [filename]" 并使用 exit 退出。

我一直在 Internet 上查找很多关于 Python 中的命令行的资料,但最后我更加困惑了。因此,到目前为止,这是我在研究方面的尝试。

    from optparse import OptionParser  

    def command_line():
        parser = OptionParser()        
        parser.add_option("--file", "-s")                             

        options, args = parser.parse_args()
        if options.a and obtions.b:
            parser.error("Usage: [-s] file_name")

            exit

    def read_file():
        #Try:
            #Open input file
        #Except:
            #print "Unable to open [filename]"
            #Exit
from optparse import OptionParser
import sys,os

def command_line():
    parser = OptionParser("%prog [-s] file_name")        
    parser.add_option("-s",dest="filename",
        metavar="file_name",help="my help message")                             

    options, args = parser.parse_args()
    if not options.filename:
        parser.print_help()
        sys.exit()
    return options.filename

def read_file(fn):
    if os.path.isfile(fn):
        typecount = {}
        with open(fn) as f:
            for line in f:
                for i in line.split()
                    try:
                        t = type(eval(i))
                    except NameError:
                        t = type(i)
                    if t in typecount:
                        typecount[t] += 1
                    else:
                        typecount[t] = 1
    else:
        print( "Unable to open {}".format(fn))
        sys.exit()

    print(typecount)

read_file(command_line())

所以一步一步来:

  • options.a 未定义,除非您定义选项 --a 或(最好)设置 dest="a".
  • 使用内置的 parser.print_help() 比自己制作更好,然后您可以免费获得 -h/--help
  • 您从未调用过您的函数 command_line,因此不会出现任何错误,因为语法是正确的。我将命令行设置为仅将文件名作为 return 值传递,但是当您有更多 options/arguments.
  • 时,有更好的方法可以做到这一点

当谈到 read_file 时,我建议使用 os.path.isfile 而不是对文件使用 try-except,它将检查文件是否存在。但是,这不会检查文件是否具有正确的格式。

然后我们创建一个类型字典,然后遍历所有行并评估由白色分隔的对象space(space,newline,tab)。如果您的值由例如分隔。一个逗号,你需要使用line.split(',')

如果您想稍后在脚本中使用计数,您可能需要 return typecount 而不是打印它。