WedX - журнал о программировании и компьютерных науках

Использование getopt () для получения значений, переданных из командной строки

Я пишу сценарий Python для создания каталогов для заданного срока и курса. Я хотел бы использовать модули Python os, sys и getopt (как с короткими, так и с длинными вариантами формы), чтобы выполняемый скрипт выглядел так:

>python directory.py –t fall2013 –c cs311-400 
>python directory.py –-term fall2013 –-class cs311-400

Код, который я сейчас написал, выглядит так:

import os
import sys
import getopt

term = ""
course = ""

options, args = getopt.getopt(sys.argv[1:], 't:c:', ['term=', 'course='])

for opt, arg in options:
    if opt in ('-t', '--term'):
        term = arg
    elif opt in ('-c', '--course'):
         course = arg

После этого у меня есть функция, которая принимает термин и, конечно, использует os.mkdir и тому подобное:

def make_folders(term, course):
    if not os.path.isdir(term + course):
        os.mkdir(term + course)
        path = os.path.join(term + course, "assignments")
        os.makedirs(path)

        path = os.path.join(term + course, "examples")
        os.makedirs(path)

        path = os.path.join(term + course, "exams")
        os.makedirs(path)

        path = os.path.join(term + course, "lecture_notes")
        os.makedirs(path)

        path = os.path.join(term + course, "submissions")
        os.makedirs(path)

make_folders(term, course)

По какой-то причине созданная папка имеет только имя, которое представляет термин, а не термин и курс. Я чувствую, что это может иметь какое-то отношение к тому, что я использую getopt, но я не уверен. Любой совет?


  • Я думаю, что getopt устарел в python2.7. stackoverflow.com/a/3217687/2530083 вместо этого используйте argparse 14.10.2013
  • В качестве дополнительного комментария, вы понимаете, что строки path = os.path.join(whatever) и os.makedirs(path) повторяются? Выполните рефакторинг, for просматривая список каталогов ["assignments", "examples", "exams", "lecture_notes", "submissions"]. 21.01.2014
  • @rtrwalker optparse устарел. getopt сохраняется для пользователей C. 21.01.2014

Ответы:


1

os.path.join - умная функция. Просто передайте столько папок, сколько вам нужно:

>>> import os
>>> os.path.join("first", "second", "third")
'first/second/third'
21.01.2014

2

Когда вы пишете term + course, Python объединяет строки в term и course напрямую, прежде чем os.path.join() даже увидит их. То есть, если, скажем, term == "fall2013" и course == "cs311-400", то term + course == "fall2013cs311-400" и ничего между ними.

Один из способов обойти это - вставить явную косую черту между термином и курсом, как в term + "/" + course. Однако, поскольку вы предположительно получили указание использовать os.path.join() < / a> (что в любом случае является хорошей идеей), вы можете просто передать все компоненты пути, которые вы хотите присоединить к нему, в качестве отдельных аргументов, и позволить ему объединить их за вас:

path = os.path.join(term, course, "exams")

Также несколько советов для вашего задания и для хорошего программирования на Python в целом:

  • Хотя модуль getopt на самом деле не устарел, как утверждения rtrwalker в комментариях, вы: вам, вероятно, лучше использовать argparse, если у вас нет используйте getopt по какой-то причине (например, по назначению).

  • Ваш код выглядит очень повторяющимся. Повторяющийся код - это "запах", который должен указывать на необходимость цикла, возможно, примерно так:

    dirs = ("assignments", "examples", "exams", "lecture_notes", "submissions")
    for folder in dirs:
        path = os.path.join(term, course, folder)
        os.makedirs(path)
    
21.01.2014

3

Я вообще-то в вашем классе; по крайней мере, я почти уверен, что я. Столкнулся с этой точной проблемой и не мог получить этот подкаталог. Поиск в Google привел меня сюда! Что ж, после еще нескольких поисков в Google и БОЛЬШОГО устранения неполадок мы нашли ответ на нашу проблему!

os.makedirs(''+term+'/'+course+'')      
path = os.path.join(''+term+'/'+course+'', "exams")
os.makedirs(path)

Это должно очистить его для вас и предоставить ваш новый каталог и подкаталоги! Удачи с остальным заданием.

14.10.2013
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]