Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python计算文件夹和子文件夹中所有文件中的文本行数_Python_Python 3.x - Fatal编程技术网

使用Python计算文件夹和子文件夹中所有文件中的文本行数

使用Python计算文件夹和子文件夹中所有文件中的文本行数,python,python-3.x,Python,Python 3.x,我有一个巨大的文件夹,其中包含子文件夹和多个.sql文件。我想获得每个.sql文件中的代码行数。这就是我尝试过的: import os import glob os.chdir("path of folder") names=[] for fn in glob.glob("*.sql"): with open(fn) as f: names[fn]=sum(1 for line in f if line.strip() and not line.startswith('#'))

我有一个巨大的文件夹,其中包含子文件夹和多个.sql文件。我想获得每个.sql文件中的代码行数。这就是我尝试过的:

import os
import glob
os.chdir("path of folder")
names=[]
for fn in glob.glob("*.sql"):
    with open(fn) as f:
    names[fn]=sum(1 for line in f if line.strip() and not line.startswith('#'))    

print(names)
但是我得到的输出是[]。你们能帮我找出哪里出了问题吗

我知道如何使用“num_line”计算单个文件中的代码行数。我不能为每个文件手动执行此操作,需要加快进程

试试这个:

sql_folder_path = "full/path/to/sql/folder"
sql_files = [join(sql_folder_path, f) for f in listdir(sql_folder_path) if isfile(join(sql_folder_path, f)) and f.endswith(".sql")]
files_stats = {}
for file in sql_files:
    with open(file) as f:
        files_stats[file]=sum(1 for line in f if line.strip() and not line.startswith('#'))
print(files_stats)

以下版本的代码适用于目标目录中的文件,但不适用于子文件夹:

import os
import glob

os.chdir("foo")
names = {}
for fn in glob.glob("*.sql"):
    with open(fn) as f:
        names[fn] = sum(1 for line in f if line.strip() and not line.startswith('#'))

print(names)
具有较新的
pathlib
的版本也可以递归工作:

#!/usr/bin/env python3

from pathlib import Path

target = Path("foo")

names = {}

for file in target.glob("**/*.sql"):
    with file.open("rt") as f:
        names[f.name] = sum(
            1 for line in f
            if line.strip() and not line.startswith('#')
        )

print(names)

通过将
recursive
标志设置为
True
并将
***/
添加到路径:
glob.glob(***/.sql,recursive=True)
,还可以使
glob.glob
递归。