我想浏览目录中的所有文件夹:
directory\
folderA\
a.cpp
folderB\
b.cpp
folderC\
c.cpp
folderD\
d.cpp
文件夹的名称都是已知的。
具体来说,我正在尝试计算每个a.cpp
,b.cpp
,c.pp
和d.cpp
源文件的代码行数。所以,进入folderA
并阅读a.cpp
,计算行数,然后返回目录,进入folderB
,阅读b.cpp
,计算行等。
这是我到目前为止所拥有的,
dir = directory_path
for folder_name in folder_list():
dir = os.path.join(dir, folder_name)
with open(dir) as file:
source= file.read()
c = source.count_lines()
但我是Python新手,不知道我的方法是否合适以及如何继续。显示的任何示例代码将不胜感激!
此外,with open
是否处理文件打开/关闭所需的所有读取或需要更多处理?
答案 0 :(得分:3)
我会这样做:
import glob
import os
path = 'C:/Users/me/Desktop/' # give the path where all the folders are located
list_of_folders = ['test1', 'test2'] # give the program a list with all the folders you need
names = {} # initialize a dict
for each_folder in list_of_folders: # go through each file from a folder
full_path = os.path.join(path, each_folder) # join the path
os.chdir(full_path) # change directory to the desired path
for each_file in glob.glob('*.cpp'): # self-explanatory
with open(each_file) as f: # opens a file - no need to close it
names[each_file] = sum(1 for line in f if line.strip())
print(names)
<强>输出:强>
{'file1.cpp': 2, 'file3.cpp': 2, 'file2.cpp': 2}
{'file1.cpp': 2, 'file3.cpp': 2, 'file2.cpp': 2}
关于with
问题,您无需关闭文件或进行任何其他检查。你应该像现在一样安全。
你可以,检查full_path
是否存在,因为某人(您)可能会错误地从您的PC中删除文件夹(来自list_of_folders
的文件夹)
您可以通过os.path.isdir
执行此操作,如果文件存在,则返回True
:
os.path.isdir(full_path)
PS:我使用的是Python 3.
答案 1 :(得分:2)
使用Python 3的os.walk()
遍历给定路径的所有子目录和文件,打开每个文件并执行逻辑。您可以使用'for'循环来遍历它,从而大大简化您的代码。
答案 2 :(得分:1)
正如manglano所说,os.walk()
您可以生成文件夹列表。
[src for src,_,_ in os.walk(sourcedir)]
您可以生成文件路径列表。
[src+'/'+file for src,dir,files in os.walk(sourcedir) for file in files]