2016-05-24 3 views
0

Я хочу создать программу, которая будет принимать два аргумента командной строки. Первый - это имя файла, который открывается для синтаксического анализа, а второй - флаг -s. Если пользователь вводит неверное количество аргументов или другой аргумент не является, тогда он выдает сообщение «Использование: [-s] имя_файла» и завершает работу программы с помощью exit.Аргументы командной строки Python Try/За исключением

Далее, я хочу, чтобы моя программа попыталась открыть файл для чтения. Программа должна открывать файл, читаемый каждой строкой, и возвращать счетчик всех чисел с плавающей точкой, целого и других типов, которые не являются ints или float. Однако, если открытие файла не удастся, оно должно вызвать исключение и напечатать «Невозможно открыть [имя_файла]» и выйти с помощью выхода.

Я искал много вещей в Интернете о командных строках в 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, вместо того, чтобы использовать для этого файла я рекомендую использовать os.path.isfile, который будет проверять, существует ли файл примерки за исключением. Это не проверяет, имеет ли файл правильный формат.

Затем мы создаем словарь типов, затем перебираем все строки и оцениваем объекты, разделенные пробелами (пробел, символ новой строки, вкладка). Если ваши значения разделены, например. запятая, вам нужно использовать line.split(',').

Если вы хотите использовать подсчеты позже в своем скрипте, вы можете вернуть typecount вместо его печати.

Смежные вопросы