2018-01-11 18:20:25 +01:00
|
|
|
|
#!/usr/bin/env python
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
Implementacja narzedzia ``wc`` z linuksa (word counter).
|
|
|
|
|
Zwraca liczbę słów, znaków i linii.
|
2018-01-11 21:14:43 +01:00
|
|
|
|
|
|
|
|
|
** zad. 4 (Domowe) **
|
|
|
|
|
Plik ``task04.py`` zawiera kod prorgamu, który działa jak popularne narzędzie unixowe ``wc`` (Word Counter): zlicza liczbę linii, wyrazów i znaków.
|
|
|
|
|
Aktualnie program potrafi działać wyłącznie na wejściu podanym z klawiatury. Dodaj do niego opcje programu:
|
|
|
|
|
* domyślnie program ma zliczać na wejściu z klawiatury (stdin) i wyświetlać wszystkie 3 liczby.
|
|
|
|
|
* Jeżeli został podany przełącznik `-l`, to to ma zostać zwrócona tylko liczba linii.
|
|
|
|
|
* Jeżeli został podany przełącznik `-w`, to to ma zostać zwrócona tylko liczba słów.
|
|
|
|
|
* Jeżeli został podany przełącznik `-c`, to to ma zostać zwrócona tylko liczba znaków.
|
|
|
|
|
* Jeżeli został podany inny argument, to należy założyć że jest to nazwa pliku i potraktować ten plik jako wejście do programu.
|
2018-01-11 18:20:25 +01:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import sys
|
2018-01-11 21:14:43 +01:00
|
|
|
|
import argparse
|
2018-01-11 18:20:25 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def count_lines(text):
|
|
|
|
|
""" return number of lines. """
|
|
|
|
|
return len(text.strip().split('\n'))
|
|
|
|
|
|
|
|
|
|
def count_words(text):
|
|
|
|
|
""" return number of words. """
|
|
|
|
|
return sum([len([1 for word in line.split(' ') if len(word)])
|
|
|
|
|
for line in text.split('\n')])
|
|
|
|
|
|
|
|
|
|
def count_chars(text):
|
2018-01-11 21:14:43 +01:00
|
|
|
|
""" return number of characters. """
|
2018-01-11 18:20:25 +01:00
|
|
|
|
return len(text)
|
|
|
|
|
|
|
|
|
|
def wc(text):
|
|
|
|
|
""" proper wc """
|
|
|
|
|
lines = count_lines(text)
|
|
|
|
|
words = count_words(text)
|
|
|
|
|
chars = count_chars(text)
|
|
|
|
|
return lines, words, chars
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
""" main """
|
2018-01-11 21:14:43 +01:00
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
|
parser.add_argument('-l', help="number of lines", action="store_true")
|
|
|
|
|
parser.add_argument('-w', help="number of words", action="store_true")
|
|
|
|
|
parser.add_argument('-c', help="number of chars", action="store_true")
|
|
|
|
|
parser.add_argument('-filename', type=argparse.FileType('r'), default='-', help='filename to read from')
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
|
|
if args.filename:
|
|
|
|
|
lines, words, chars = wc(args.filename.read())
|
|
|
|
|
elif not sys.stdin.isatty():
|
|
|
|
|
lines, words, chars = wc(args.stdin.read())
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
if(args.l):
|
|
|
|
|
print(lines)
|
|
|
|
|
elif(args.w):
|
|
|
|
|
print(words)
|
|
|
|
|
elif(args.c):
|
|
|
|
|
print(chars)
|
|
|
|
|
else:
|
|
|
|
|
print(lines, words, chars)
|
2018-01-11 18:20:25 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|