【问题标题】:How many rows of comment-less code do I have?我有多少行无注释代码?
【发布时间】:2019-02-15 23:00:10
【问题描述】:

如果我有一个带有 X 行的 python 文件,但 Y 行仅由 cmets 占用,Z 行只是空白,我如何找到 N,N=X-Y-Z?

这是我尝试过的。这是我的示例代码;

#This is a function to find prime numbers...
#..., it's taken from https://stackoverflow.com/questions/14656473/python-beginners-loop-finding-primes

primes_in_a_list = []
for p in range(2, 100):
    for i in range(2, p):
        if p % i == 0:
            break
    else:
        primes_in_a_list.append(p)

print (primes_in_a_list)

在上面的示例中,有 12 行,我想运行另一个打印出 8 的 .py 文件/脚本。使用下面的代码,我得到 10 作为答案。

x, y, z = 0, 0, 0

with open('test.py') as f:
    content = f.readlines()

content = [x.strip() for x in content]
for line in content:
    theline = line[2:]
    x += 1
    if theline.startswith('#'):
        y += 1
    if not theline:
        z += 1
n = x-y-z

print (n)

【问题讨论】:

  • 与其自己重新发明这个特殊的轮子,我可以指导你到David Wheeler's sloccount吗?
  • 顺便说一句,请注意f.readline() 在空行上返回'\n',而不是''。而且我想知道您是否打算有一个循环遍历整个文件,而不仅仅是查看第一行。坦率地说,在分析之前strip() 每一行可能是有意义的;除了删除尾随的\n,它还会捕获缩进的 cmets。
  • 你也想处理多行 cmets 吗?
  • ...您所做的编辑已经解决了您的一些问题,但您仍然没有读过第一行,即使您将变量从 firstline 重命名为 line .
  • 不,每一行 ends\n (它是一个字符,而不是两个;r'\n' 是两个字符,但是将其写为非原始字符串将是'\\n')。

标签: python


【解决方案1】:

在外壳中使用grepwc

grep -vE '^[[:space:]]*#|^$' test.py | wc -l

这将给出8

  • ^[[:space:]]*# 将匹配零个或多个空格 ([[:space:]]),然后在 ^ 行的开头后跟一个 #
  • ^$ 匹配行首 ^ 后跟行尾 $
  • | 是一个或运算符,如果满足任一表达式则匹配
  • -E 选项到grep 启用扩展正则表达式
  • grep-v 选项反转匹配,即它返回 匹配模式的行
  • wc 计算文件或流中的换行符、单词或字节数,-l 选项仅返回(新)行数
  • shell 中的| 将左侧命令的(标准)输出传送到右侧命令的(标准输入)。

匹配多行 cmets 更加困难,因为您需要找到两个标记之间的行。使用sed 可能是可能的,但我现在不太确定该怎么做。

【讨论】:

  • \s 不能保证即使与grep -E 一起工作(取决于您的标准 C 库的正则表达式函数提供的功能不在 POSIX 标准中);更便携使用[[:space:]]
  • 感谢您的提示,我编辑了答案以包含它,因为它对我有用! @CharlesDuffy
  • @CharlesDuffy 好的,我会相应地进行编辑,感谢您的提示。
  • (在这里,我从 Python 标记中认为 OP 想要一个 Python 答案,并且将其作为学习练习而不是实际问题)。
  • @CharlesDuffy OP 说“我想运行另一个打印出 8 的 .py-file/**script**”(强调我的),所以我认为 shell/grep/wc 很好.
【解决方案2】:

with 只是打开文件;它不会遍历其内容。

如果你想读完第一行,添加一个循环inside,如:

with open('test.py') as f:
    for line in f.readline()
        x += 1
        if line.startswith('#'):
            y += 1
        if line.startswith('\n') or line.startswith('\r\n'):
            z += 1

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2013-12-11
    • 2014-03-10
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2021-08-25
    相关资源
    最近更新 更多