第0007道练习题_Python统计代码行数注释行数空白行数

Python练习题第 0007 题

https://github.com/Show-Me-the-Code/show-me-the-code
第 0007 题:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来

很多伙伴们的代码考虑的不全面。

作为一名专业的QA,我决定认真写个用来分析java程序代码行、空白行、注释行的Python程序!

我的程序能应对以下情况

  1. 没有实际有效代码的行为空白行
  2. 实际有效代码以//开头的是注释行,下面这个,是代码行

    int a = 1;//note1
  3. /*和*/包裹的为注释行,但是如果*/后面或者/*前面还有有效代码的话,那么这一行其实是代码行。什么意思呢?举个栗子~
int aaa = 9;/*--
        note 1
        note 2
        -*/ aaa += 1;

比如这个,它的注释行数为2,代码行数为2(这种代码风格实在不推荐,但是保不齐哪个程序猿哥哥就揍么个性~)

Talk is cheap, show you my code. 黑喂够~~

我的Python代码能够正确处理以下情况,但是,坦白地说,毕竟我做的不是解析器,跟专业的IDE相比还是差老鼻子远了。

        int aaa = 9; /*             //Code
        note 1                      //Note
        */  aaa += 1; /*~~~~~~      //Code
        /*----                      //Note
        --*/                        //Note
                                    //Blank
        /*---*/                     //Note
        /*---*/      /*-----        //Note
        /*----*/  //                //Note
        driver.manage().window().maximize();/*.....*/ //Code
#! /usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Sophie'

def blank_row(s):
    s = s.strip("\n\r\t   ")
    if len(s) == 0:
        return True
    else:
        return False

def note_row(s):
    s = s.strip("\n\r\t   ")
    if len(s) == 1:
        return "Code"
    elif len(s)>=2 and s[0]=='/' and s[1]=='/':
        return "Note"
    elif len(s)>=2 and s[0]=='/' and s[1]=='*':
        if s.rfind("*/") == -1 :
            return "NoteNotEnd"
        elif s.rfind("*/") == len(s) -2:
            return "Note"
        elif s.rfind("*/") < len(s) -2:
            return note_row(s[s.rfind("*/")+2:len(s)])
    elif s.rfind(";") == len(s) -1:#code
        return "Code"
    elif s.rfind(";")!=-1 and s.rfind(";") < len(s) -1:
        if note_row(s[s.rfind(";")+1:len(s)]) == "Note":
            return "Code"
        elif note_row(s[s.rfind(";")+1:len(s)]) == "NoteNotEnd":
            return "Code_NoteNotEnd"
        elif note_row(s[s.rfind(";")+1:len(s)]) == "Code":
            return "Code"
    elif s.rfind(";") == -1:
        if s.rfind("/*") == -1:
            return "Code"
        else:
            return "NoteNotEnd"

def note_blank_row_count(list_of_codes):
    l = len(list_of_codes)
    i = 1
    list_of_status=[]

    # analyze the very 1st line
    if blank_row(list_of_codes[0]):
        list_of_status.append("Blank")
    else:
        list_of_status.append(note_row(list_of_codes[0]))

    while i < l:
        if list_of_status[i-1]=="Code" or list_of_status[i-1]=="Note"or list_of_status[i-1]=="Blank"or list_of_status[i-1]=="NoteEnd":
            if blank_row(list_of_codes[i]):
                list_of_status.append("Blank")
            else:
                list_of_status.append(note_row(list_of_codes[i]))
            i += 1
            continue

        elif list_of_status[i-1]=="Code_NoteNotEnd"or list_of_status[i-1]=="NoteNotEnd":
            pos = list_of_codes[i].rfind("*/")
            if pos == -1:
                i += 1
                list_of_status.append("NoteNotEnd")
                continue
            else:
                if blank_row(list_of_codes[i][pos+2:len(list_of_codes[i])-1]):
                    list_of_status.append("NoteEnd")
                else:
                    list_of_status.append(note_row(list_of_codes[i][pos+2:len(list_of_codes[i])-1]))
                i += 1

    return list_of_status



if __name__ == '__main__':
    file = open("/Users/Sophie/IdeaProjects/BBSAutoLoginReplyScreenShot/src/test.java",'r')
    try:
        list_of_rows = file.readlines()
    finally:
        file.close()

    total_row = len(list_of_rows)
    blank = 0
    code = 0
    #print total_row
    analyze_result = note_blank_row_count(list_of_rows)

    for i in range(len(analyze_result)):
        print "row " , i+1, "~~~~",analyze_result[i]

    for x in analyze_result:
        if x == "Blank":
            blank += 1
        elif "Code" in x:
            code += 1

    note = total_row - blank - code
    print "Total row: ", total_row, "\nBlank row: ",blank,"\nCode row: ",code,"\nNote row: ",note

被Python程序分析的java程序代码如下:


import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
import java.util.Calendar;
import java.util.regex.*;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.File;

public class aaa {
    public static int t = 1;
    public static String getDateTime(){
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_HHmmss");
        return df.format(new Date());
    }
    public static void ScreenShot(WebDriver dr, String dir){
        File screenShot = ((TakesScreenshot)dr).getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(screenShot, new File(dir+getDateTime()+"_"+t+".jpg"));
            ++t;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) throws Exception {
        System.out.println(AutoLoginReplyScreenshot.getDateTime());
        WebDriver driver = new FirefoxDriver();
        String loginUrl = "https://www.wacai.com/user/user.action?url=http%3A%2F%2Fbbs.wacai.com%2Fportal.php";
        String basicURL ="http://bbs.wacai.com/portal.php";
        String dir = "/Users/Sophie/IdeaProjects/BBSAutoLoginReplyScreenShot/ScreenShot/";
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        driver.get(loginUrl);
        driver.manage().window().maximize();

        //delete all pics if there are more than 80
        File file = new File(dir);
        File[] fs = file.listFiles();
        if(fs.length >= 80){
            for(File f: fs){
                if(f.getName().contains("jpg"))
                    f.delete();
            }
        }
        /**
         * 1st screen shot: login page
         */
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        driver.findElement(By.id("account")).clear();
        driver.findElement(By.id("account")).sendKeys("18611742186");
        driver.findElement(By.id("pwd")).clear();
        driver.findElement(By.id("pwd")).sendKeys("leilei20w");
        driver.findElement(By.id("login-btn")).click();
        driver.manage().window().maximize();

        /**
         *2nd screen shot: after login
         */
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        String a = driver.findElement(By.cssSelector(".name")).getAttribute("href");
        driver.get(a);

        String pi = driver.findElement(By.xpath("//div[@class='userHead container']/div[@class='tabs w_tab']/nav/ul/li[5]/a")).getAttribute("href");
        driver.get(pi);

        /**
         * 3rd screen shot: personal info
         */ int aaaiii = 0;//~~
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        driver.get(basicURL);

        //get the bbs portal page, find the specific forum href
        a = driver.findElement(By.linkText("签到有礼")).getAttribute("href");
        driver.get(a);

        /**
         * 4th screen shot: check-in forum
         */
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        //Thread title
        Calendar c = Calendar.getInstance();
        int m = c.get(Calendar.MONTH)+1;
        int d = c.get(Calendar.DAY_OF_MONTH);
        String dd = ""+d;
        if (d < 10)
            dd = "0"+dd;
        String threadTitle = "签到有礼"+m+"."+dd+"每天签到得铜钱";

        //find today's check-in thread
        a =  driver.findElement(By.partialLinkText(threadTitle)).getAttribute("href");
        driver.get(a);

        /**
         * 5th screen shot: check-in thread
         */
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        //using regrex to find the content we use to reply
        Pattern p = Pattern.compile("回帖内容必须为.+</font>非此内容将收回铜钱奖励");
        Matcher r = p.matcher(driver.getPageSource().toString());
        StringBuffer key = new StringBuffer();
        while(r.find()){
            key.append(r.group());
        }
        //using xpath locate the textarea and submit button
        driver.findElement(By.xpath("//textarea[@id='fastpostmessage']")).sendKeys(key.substring(key.indexOf(">")+1, key.indexOf("</")-1));
        driver.manage().window().maximize();/*.....*/

        /**
         * 6th screen shot: key words
         */
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        driver.findElement(By.xpath("//button[@id='fastpostsubmit']")).click();

        /**
         * 7th screen shot: after reply
         */
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        //go to personal info page
        driver.get(pi);

        /**
         * 8th screen shot: check the coin amount
         */
        AutoLoginReplyScreenshot.ScreenShot(driver, dir);

        driver.close();
        System.out.println(AutoLoginReplyScreenshot.getDateTime());

        int aaa = 9; /*
        note 1
        */  aaa += 1; /*~~~~~~
        /*----
        --*/

        /*---*/
        /*---*/      /*-----
        /*----*/  //
    }
}

针对上述java代码,程序输出结果如下:
/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/Sophie/PycharmProjects/Practice_0007/Practice_0007.py
row 1 ~~ Blank
row 2 ~
~ Code
row 3 ~~ Code
row 4 ~
~ Code
row 5 ~~ Code
row 6 ~
~ Code
row 7 ~~ Code
row 8 ~
~ Code
row 9 ~~ Code
row 10 ~
~ Code
row 11 ~~ Code
row 12 ~
~ Blank
row 13 ~~ Code
row 14 ~
~ Code
row 15 ~~ Code
row 16 ~
~ Code
row 17 ~~ Code
row 18 ~
~ Code
row 19 ~~ Code
row 20 ~
~ Code
row 21 ~~ Code
row 22 ~
~ Code
row 23 ~~ Code
row 24 ~
~ Code
row 25 ~~ Code
row 26 ~
~ Code
row 27 ~~ Code
row 28 ~
~ Blank
row 29 ~~ Code
row 30 ~
~ Code
row 31 ~~ Code
row 32 ~
~ Code
row 33 ~~ Code
row 34 ~
~ Code
row 35 ~~ Code
row 36 ~
~ Code
row 37 ~~ Code
row 38 ~
~ Blank
row 39 ~~ Note
row 40 ~
~ Code
row 41 ~~ Code
row 42 ~
~ Code
row 43 ~~ Code
row 44 ~
~ Code
row 45 ~~ Code
row 46 ~
~ Code
row 47 ~~ Code
row 48 ~
~ NoteNotEnd
row 49 ~~ NoteNotEnd
row 50 ~
~ NoteEnd
row 51 ~~ Code
row 52 ~
~ Blank
row 53 ~~ Code
row 54 ~
~ Code
row 55 ~~ Code
row 56 ~
~ Code
row 57 ~~ Code
row 58 ~
~ Code
row 59 ~~ Blank
row 60 ~
~ NoteNotEnd
row 61 ~~ NoteNotEnd
row 62 ~
~ NoteEnd
row 63 ~~ Code
row 64 ~
~ Blank
row 65 ~~ Code
row 66 ~
~ Code
row 67 ~~ Blank
row 68 ~
~ Code
row 69 ~~ Code
row 70 ~
~ Blank
row 71 ~~ NoteNotEnd
row 72 ~
~ NoteNotEnd
row 73 ~~ Code
row 74 ~
~ Code
row 75 ~~ Blank
row 76 ~
~ Code
row 77 ~~ Blank
row 78 ~
~ Note
row 79 ~~ Code
row 80 ~
~ Code
row 81 ~~ Blank
row 82 ~
~ NoteNotEnd
row 83 ~~ NoteNotEnd
row 84 ~
~ NoteEnd
row 85 ~~ Code
row 86 ~
~ Blank
row 87 ~~ Note
row 88 ~
~ Code
row 89 ~~ Code
row 90 ~
~ Code
row 91 ~~ Code
row 92 ~
~ Code
row 93 ~~ Code
row 94 ~
~ Code
row 95 ~~ Blank
row 96 ~
~ Note
row 97 ~~ Code
row 98 ~
~ Code
row 99 ~~ Blank
row 100 ~
~ NoteNotEnd
row 101 ~~ NoteNotEnd
row 102 ~
~ NoteEnd
row 103 ~~ Code
row 104 ~
~ Blank
row 105 ~~ Note
row 106 ~
~ Code
row 107 ~~ Code
row 108 ~
~ Code
row 109 ~~ Code
row 110 ~
~ Code
row 111 ~~ Code
row 112 ~
~ Note
row 113 ~~ Code
row 114 ~
~ Code
row 115 ~~ Blank
row 116 ~
~ NoteNotEnd
row 117 ~~ NoteNotEnd
row 118 ~
~ NoteEnd
row 119 ~~ Code
row 120 ~
~ Blank
row 121 ~~ Code
row 122 ~
~ Blank
row 123 ~~ NoteNotEnd
row 124 ~
~ NoteNotEnd
row 125 ~~ NoteEnd
row 126 ~
~ Code
row 127 ~~ Blank
row 128 ~
~ Note
row 129 ~~ Code
row 130 ~
~ Blank
row 131 ~~ NoteNotEnd
row 132 ~
~ NoteNotEnd
row 133 ~~ NoteEnd
row 134 ~
~ Code
row 135 ~~ Blank
row 136 ~
~ Code
row 137 ~~ Code
row 138 ~
~ Blank
row 139 ~~ Code_NoteNotEnd
row 140 ~
~ NoteNotEnd
row 141 ~~ Code_NoteNotEnd
row 142 ~
~ NoteNotEnd
row 143 ~~ NoteEnd
row 144 ~
~ Blank
row 145 ~~ Note
row 146 ~
~ NoteNotEnd
row 147 ~~ Note
row 148 ~
~ Code
row 149 ~~~~ Code
Total row: 149
Blank row: 24
Code row: 89
Note row: 36

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值