1

Тема: Передача параметрів в Python

Є 2 типи параметрів: опції та аргументи (обов'язкові). Перед тим як почати потрібно зрозуміти в чому різниця між опціями та аргументами.


Опції - необов'язкові параметри, які передаються в програму. На початку потрібно ставити символ "-" для коротких опцій, і символ "--" для довгих.
Наприклад, програму яка друкує кількість символів у файлі можна запускати з опцією -x або --extended:

./calculate_symbols.py -x
./calculate_symbols.py --extended

Також можна, наприклад, додати ще опцію яка не буде враховувати пробільні символи.


Аргументи - це обов'язкові параметри, які передаються в програму. В розглянутому више прикладі, це може бути ім'я файлу (шлях), в якому потрібно підрахувати кількість символів

./calculate_symbols.py test.txt
./calculate_symbols.py /Users/replace/test.txt

Перейдемо до коду. Обробляти параметри можна за допомогою бібліотеки argparse, але спочатку напишемо код без її використання.

#!/usr/bin/python
# -*- coding: utf8 -*-
# Copyright 2012 Replace.org.ua

"""
Невелика програма для підрахунку кількості символів в файлі
Опції: -x --extended - додатково показує кількість маленьких та великих літер
"""

import sys

def calculate_symbols():
    
    # Перевіряємо кількість параметрів
    if len(sys.argv) >= 2:
        filename = sys.argv[1] # шлях до файлу
    else:
        print 'Filename expected'
        exit(0)
    
    is_extended = False
    
    # Перевіряємо чи є опції
    if len(sys.argv) >= 3:
        options = sys.argv[2:] # наші опції
        for option in options:
            if option == '-x' or option == '--extended':
                is_extended = True
            else:
                print 'Unexpected option', option
                
    # Читаємо з файла
    try:
        f = open(filename)
        data = f.read()
        f.close()
    except:
        print 'File', filename, 'not found.'
        exit(0)
    
    print 'File', filename, 'has', len(data), 'symbols.',
    if is_extended:
        print 'Lower case letters:', str(calculate_lower(data)) + '. Upper case:', calculate_upper(data)
    else:
        print

def calculate_upper(data):
    
    #кількість великих літер
    count = 0
    for ch in data:
        if ch > 'A' and ch < 'Z':
            count += 1
    return count


def calculate_lower(data):

    #кількість мельких літер
    count = 0
    for ch in data:
        if ch > 'a' and ch < 'z':
            count += 1
    return count

if __name__ == '__main__':
    calculate_symbols()

Те саме але з використанням бібліотеки argparse (Python >= 2.7 and >= 3.2):

#!/usr/bin/python
# -*- coding: utf8 -*-
# Copyright 2012 Replace.org.ua

"""
Невелика програма для підрахунку кількості символів в файлі з використанням бібліотеки argparse
Опції: -x --extended - додатково показує кількість маленьких та великих літер
"""

import argparse

def calculate_symbols():
    
    # створюємо об'єкт parser
    parser = argparse.ArgumentParser()
    parser.add_argument('filename') # обов'язковий параметр filename
    parser.add_argument('-x','--extended', help='display extended informatiion', action='store_true') # якщо вказати -/-- на початку парсер сам зрозуміє, що це опція
    
    # записуємо параметри в args
    args = vars(parser.parse_args()
    is_extended = args['extended']
    filename = args['filename']
    
    # Читаємо з файла
    try:
        f = open(filename)
        data = f.read()
        f.close()
    except:
        print 'File', filename, 'not found.'
        exit(0)
    
    print 'File', filename, 'has', len(data), 'symbols.',
    if is_extended:
        print 'Lower case letters:', str(calculate_lower(data)) + '. Upper case:', calculate_upper(data)
    else:
        print

def calculate_upper(data):
    
    #кількість великих літер
    count = 0
    for ch in data:
        if ch > 'A' and ch < 'Z':
            count += 1
    return count


def calculate_lower(data):

    #кількість мельких літер
    count = 0
    for ch in data:
        if ch > 'a' and ch < 'z':
            count += 1
    return count

if __name__ == '__main__':
    calculate_symbols()

Бібліотека argparse має велику кількість можливостей. Більш детально можна почитати в документації http://docs.python.org/dev/library/argparse.html А так взагалі мені більше довподопи писати свій велосипед.


Приклади використання:


Без параметрів:

./test.py
usage: test.py [-h] [-x] filename
test.py: error: too few arguments

help:

./test.py -h
usage: test.py [-h] [-x] filename

positional arguments:
  filename

optional arguments:
  -h, --help      show this help message and exit
  -x, --extended  display extended informatiion

Нормальний режим роботи:

./test.py test.py
File test.py has 1750 symbols.

З опцією extended:

./test.py test.py -x
File test.py has 1750 symbols. Lower case letters: 555. Upper case: 7

Можете попрактикуватись переробивши додавши ще одну опцію, тоді буде враховуватись тільки пробільні символи.


Написано для Replace.org.ua

2 Востаннє редагувалося volodymyrko (06.02.2013 11:45:31)

Re: Передача параметрів в Python

в 2-ому варіанті коду є 2 помилки:

1.

args = vars(parser.parse_args()

тут бракує закриваючої дужки

2. логічна.. перевірив скрипт неправильно рахує к-ть букв,

 cat  word.txt
abcdz
volodya@linux:~/python$ ~/python-2.7.2/bin/python /home/volodya/python/word-count.py  -x word.txt
File word.txt has 6 symbols. Lower case letters: 3. Upper case: 0

бо

if ch > 'a' and ch < 'z':

не враховуються букви a та z (A і Z також)

думаю правильніше
if ch >= 'a' and ch <= 'z':
і
if ch >= 'A' and ch <= 'Z':

Подякували: Chemist-i1

3

Re: Передача параметрів в Python

Можна ще спростити роботу з літерами за допомогою модуля string:

>>> from string import lowercase, uppercase
>>> lowercase
'abcdefghijklmnopqrstuvwxyz'

Тобто, виходить, що можна перевіряти маленькі літери ось так:

if ch in lowercase:

Аналогічно з великими. Що простіше і більше по-пітонячому )

4

Re: Передача параметрів в Python

if ch in 'FFFF'.lower():