在量化计算中,对多个结构进行计算后,会产生一系列的结果文件,其中每个结构的结果文件的名字均有相同的。比如,对五个结构进行xtb结构优化,优化后产生的结构文件名均为:xtbopt.xyz。接着想基于优化后的结构文件进行进一步计算。因此需要先将这个结构文件提取出来,并存储在新的文件夹下,方便后续处理。
逻辑图示意
代码思路设计
- 使用os.listdir()获取文件夹路径下的所有子文件夹名字列表
- 接着使用for循环,依次遍历每个文件夹及每个子文件夹下的所有文件
- 基于if条件结构,筛选文件名为’xtbopt.xyz’的文件
- 建立存储指定文件的新路径,并建立跟子文件夹名字一样的子文件夹
- 获取指定文件的所在路径,使用shutil.copy()对文件进行重命名与复制到新路径
代码实现
import os
import shutil
def bulid_files(save_dir,file_number):
'''
该函数实现建立一系列空文件夹
save_dir:存放一系列文件夹的路径
'''
for i in range(0,file_number,1):
save_path=os.path.join(save_dir,'POSCAR'+str(i))
if not os.path.exists(save_path):
os.makedirs(save_path)
def fileExtractAndRename(folder_path,save_dir,folder_name):
'''
从文件夹中提取某份文件,存入进新文件夹并重命名
folder_path:文件夹所在路径
save_dir:存储提取文件所在路径
folder_name:文件夹名
file_number:子文件夹数量
思路设计:
遍历文件夹下所有子文件夹,找到规定文件名的文件
将该文件复制到新路径,并重新命名
'''
new_folder=folder_name+'_xtb' #定义好提取文件存储到新的文件夹的名字
save_path=os.path.join(save_dir,new_folder)#新文件夹的路径
if os.path.exists(save_path):
shutil.rmtree(save_path) #如果已经存在该文件夹,移除
if not os.path.exists(save_path):
os.makedirs(save_path) #如果不存在该文件夹,则创建,用于储存后续提取出来的文件
folderlist=os.listdir(folder_path)#文件夹列表
bulid_files(save_dir=save_path,file_number=len(folderlist))#在新文件夹路径下创建多个文件夹
for folder in folderlist:#遍历每个文件夹
filepath=os.path.join(folder_path,folder)#文件夹路径
filelist=os.listdir(filepath)#每个文件夹下的文件名列表
for file_name in filelist:#遍历每份文件
if file_name=='xtbopt.xyz':
file_fullname = os.path.join(filepath, file_name) #文件所在路径
new_filepath=os.path.join(save_path,folder)#新文件夹路径
shutil.copy(file_fullname, os.path.join(new_filepath,folder+'.xyz'))#将列表中的文件复制到新的文件夹,并重新命名
定义好文件夹路径、新文件夹路径及文件夹名字,运行函数fileExtractAndRename(folder_path,save_dir,folder_name)
即可完成文件的识别、重命名与复制。