如何计算jupyter笔记本中的代码行数

时间:2017-07-28 20:45:10

标签: python jupyter-notebook

我目前正在使用Jupyter ipython笔记本,而我正在使用的文件有很多代码。我只是好奇我的文件中有多少行代码。由于我将代码分成许多不同的块,因此很难计算。

对于有jupyter笔记本经验的人,你如何计算文件中有多少行代码?

谢谢!

编辑:虽然以一种相当模糊的方式,但我已经想出了如何做到这一点。下面是这样的:将jupyter笔记本下载为.py文件,然后在Xcode等软件中打开.py文件,或者使用你使用的任何IDE,并计算那里的代码行。

3 个答案:

答案 0 :(得分:8)

这将为您提供通过命令行传递给脚本的一个或多个笔记本中LOC的总数:

#!/usr/bin/env python

from json import load
from sys import argv

def loc(nb):
    cells = load(open(nb))['cells']
    return sum(len(c['source']) for c in cells if c['cell_type'] == 'code')

def run(ipynb_files):
    return sum(loc(nb) for nb in ipynb_files)

if __name__ == '__main__':
    print(run(argv[1:]))

所以你可以做$ ./loc.py nb1.ipynb nb2.ipynb之类的事情来获得结果。

答案 1 :(得分:0)

如果您有一个有用的jq实用程序,也可以从shell进行以下操作:

jq '.cells[] | select(.cell_type == "code") .source[]' nb1.ipynb nb2.ipynb | wc -l

此外,您可以使用grep进一步过滤行,例如删除空白行: | grep -e ^\"\\\\n\"$ | wc -l

答案 2 :(得分:0)

@Jessime Kirk的回答非常好。但是似乎ipynb文件不应该包含中文字符。因此,我对代码进行了如下优化。

#!/usr/bin/env python

from json import load
from sys import argv

def loc(nb):
    with open(nb, encoding='utf-8') as data_file:
        cells = load(data_file)['cells']
        return sum(len(c['source']) for c in cells if c['cell_type'] == 'code')

def run(ipynb_files):
    return sum(loc(nb) for nb in ipynb_files)

if __name__ == '__main__':
    print(r"This file can count the code lines number in .ipynb files.")
    print(r"usage:python countIpynbLine.py xxx.ipynb")
    print(r"example:python countIpynbLine.py .\test_folder\test.ipynb")
    print(r"it can also count multiple code.ipynb lines.")
    print(r"usage:python countIpynbLine.py code_1.ipynb code_2.ipynb")
    print(r"start to count line number")
    print(run(argv[1:]))