2016-05-24 77 views
0

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

接下来,我希望我的程序尝试打开文件以供阅读。程序应该打开文件读取每行,并返回每个浮点数,整数以及其他类型的非整数或浮点数的字符串的计数。但是,如果打开文件失败,它应该引发异常并打印“无法打开[文件名]”并退出。

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

你可能会说出你是什么感到困惑,或者你为什么认为你所尝试的不起作用? –

+0

问题是? – abukaj

+0

@MT我猜我更加困惑的是第二部分,我将实际读取文件并返回基于此的内容,当我运行代码时,我至今没有给出任何错误所以我猜这部分似乎在工作 – user6292348

回答

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

所以一步一步:未定义

  • options.a除非你定义一个选项--a或(优选地)设置dest="a"
  • 使用内置的parser.print_help()比制作自己的要好,那么免费获得-h/--help
  • 你永远不会调用你的函数command_line,因此从来没有得到任何错误,因为语法是正确的。我将命令行设置为仅传递文件名作为返回值,但有更好的方法可以在您有更多选项/参数时执行此操作。

当谈到read_file,而不是使用try-除了我建议使用os.path.isfile的文件,该文件将检查文件是否存在。这并不检查文件是否具有正确的格式。

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

如果您想在脚本后面使用计数,您可能想要返回typecount而不是打印它。