python使用optparse模块实现wc命令(二)

本文介绍了一个使用 Python 实现的类似于 Unix/Linux 中 wc 命令的工具,该工具通过 optparse 模块支持多种选项参数,能够统计文件的行数、单词数和字符数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是继上一篇的wc命令升级版,使用了optparse模块,可以带参数-l,-w,-c,下面是wc命令实现的效果:

[root@js python]# wc /etc/passwd
  32   52 1530 /etc/passwd
[root@js python]# wc -l /etc/passwd
32 /etc/passwd
[root@js python]# wc -w /etc/passwd
52 /etc/passwd
[root@js python]# wc -c /etc/passwd
1530 /etc/passwd

下面是用python编写的程序:

[root@js python]# cat parse4.py
#!/usr/bin/python
import sys
import os
from optparse import OptionParser
def opt():
    parser = OptionParser()
    parser.add_option("-c","--char",
                      dest="chars",
                      action="store_true",
                      default=False,
                      help="only count chars")
    parser.add_option("-w","--word",
                      dest="words",
                      action="store_true",
                      default=False,
                      help="only count words")
    parser.add_option("-l","--line",
                      dest="lines",
                      action="store_true",
                      default=False,
                      help="only count lines")
    options,args = parser.parse_args()
    return options,args

def get_count(data):
    chars = len(data)
    words = len(data.split())
    lines = data.count('\n')
    return lines,words,chars

def print_wc(options,lines,words,chars,fn):
    if options.lines:
        print lines,
    if options.words:
        print words,
    if options.chars:
        print chars,
    print fn

def main():
    options,args = opt()
    if not (options.lines or options.words or options.chars):
        options.lines,options.words,options.chars =True,True,True
    if args:
        total_lines,total_words,total_chars = 0,0,0
        for fn in args:
            if os.path.isfile(fn):
                with open(fn) as fd:
                    data = fd.read()
                lines,words,chars = get_count(data)
                print_wc(options,lines,words,chars,fn)
                total_lines += lines
                total_words += words
                total_chars += chars
            elif os.path.isdir(fn):
                print >>sys.stderr, "%s: is a directory\n" %fn
            else:
                sys.stderr.write("wc: %s No such file or directory\n" %fn)
        if len(args) > 1:
            print_wc(options,total_lines,total_words,total_chars,'total')
    else:
        data = sys.stdin.read()
        fn = ''
        lines,words,chars = get_count(data)
        print_wc(options,lines,words,chars,fn)

main()

简单测试一下:

[root@js python]# python parse4.py /etc/passwd
32 52 1530 /etc/passwd
[root@js python]# python parse4.py -l /etc/passwd  
32 /etc/passwd
[root@js python]# python parse4.py -wcl /etc/passwd
32 52 1530 /etc/passwd
[root@js python]# python parse4.py -wcl /etc/passwd /etc/hosts
32 52 1530 /etc/passwd
2 10 158 /etc/hosts
34 62 1688 total
[root@js python]# python parse4.py  /etc/passwd /etc/hosts
32 52 1530 /etc/passwd
2 10 158 /etc/hosts
34 62 1688 total
[root@js python]# cat /etc/passwd |python parse4.py 
32 52 1530

基本实现了wc的功能,结束。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值