Python命令行参数Try / Except

时间:2016-05-24 07:31:41

标签: python command-line python-2.6

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

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

我一直在互联网上查找有关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

1 个答案:

答案 0 :(得分:0)

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())

一步一步:

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

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

然后我们创建一个类型字典,然后遍历所有行并评估由空格(空格,换行符,制表符)分隔的对象。如果您的值由例如。逗号,您需要使用line.split(',')

如果您希望稍后在脚本中使用计数,则可能需要返回typecount而不是打印它。