配置文件读取要点python支持读取以.ini和.conf结尾的配置文件,将配置文件放在外部有利于后续修改。读取配置文件时通常使用相对路径。这时首先要获取当前文件所在文件夹的绝对路径,可以使用如下代码获取:path=os.path.dirname(__file__)如果要获取的相对路径当前文件然后只需将dirname更改为abspath。下面是读取配置文件的完整代码:importconfigparserimportosimportshutil#创建配置文件读取对象cf=configparser.ConfigParser()#获取当前文件夹的绝对路径path=os.path.dirname(__file__)print(path)#load配置文件cf.read(path+"/config.ini")configparser在对该文件进行后续操作之前需要先调用read()方法读取该文件,这一点需要注意。配置文件的格式如下:[filePath]sourcePath=E:/testCopyFile/sourceDirdestPath=E:/testCopyFile/destDir/配置文件中需要注意的是string类型的配置不需要引号。python的copy部分有一个shutil包,支持文件操作。使用copytree()方法复制文件夹。需要注意的是,当目标文件夹存在时,复制会失败并报错。这时候需要修改源码来避免这个问题(shutil.py的源码):def_copytree(entries,src,dst,symlinks,ignore,copy_function,ignore_dangling_symlinks,dirs_exist_ok=False):ifignoreisnotNone:ignored_names=ignore(os.fspath(src),[x.nameforxinentries])else:ignored_names=set()#this本来是没有判断文件夹不存在的。这里判断文件夹不存在时创建文件夹,避免直接创建可能导致的错误。如果不是os.path.exists(dst):os.makedirs(dst,exist_ok=dirs_exist_ok)errors=[]use_srcentry=copy_functioniscopy2orcopy_functioniscopyforsrcentryinentries:ifsrcentry.nameinignored_names:continuesrcname=os.path.join(src,srcentry.name)dstname=os.path.join(dst,srcentry.name)srcobj=srcentryifuse_srcentryelsesrcnametry:is_symlink=srcentry.is_symlink()ifis_symlinkandos.name=='nt':#特别检查目录连接,which显示为#符号链接,但我们想要递归。lstat=srcentry.stat(follow_symlinks=False)iflstat.st_reparse_tag==stat.IO_REPARSE_TAG_MOUNT_POINT:is_symlink=Falseifis_symlink:linkto=os.readlink(srcname)ifsymlinks:#我们不能把它留给`copy_function`因为legacy#具有自定义`copy_function`的代码可能依赖于copytree#做正确的事情。os.symlink(linkto,dstname)copystat(srcobj,dstname,follow_symlinks=notsymlinks)else:#如果标志打开则忽略悬挂符号链接os.path.exists(linkto)andignore_dangling_symlinks:continue#否则让复制发生.如果srcentry.copy2将引发错误。is_dir():copytree(srcobj,dstname,symlinks,ignore,copy_function,dirs_exist_ok=dirs_exist_ok)else:copy_function(srcobj,dstname)elifsrcentry.is_dir():copytree(srcobj,dstname,符号链接,忽略,copy_function,dirs_exist_ok=dirs_exist_ok)else:#将为不支持的文件类型引发SpecialFileErrorcopy_function(srcobj,dstname)#从递归复制树中捕获错误,以便我们可以#继续处理除错误之外的其他文件aserr:errors.extend(err.args[0])exceptOSErroraswhy:errors.append((srcname,dstname,str(why)))try:copystat(src,dst)exceptOSErroraswhy:#在Windows上复制文件访问时间可能会失败ifgetattr(why,'winerror',无)是无:errors.append((src,dst,str(why)))iferrors:raiseError(errors)returndst还有一点就是在目标文件夹中不会创建源文件夹,也就是说这个方法相当于添加将源文件夹中的所有内容复制到目标文件夹中。由于我需要源文件夹存在于目标文件夹中,因此我需要将源文件夹放在路径中:sourcePath=cf.get('filePath','sourcePath')destRootPath=cf.get('filePath','destPath')destCopyPath=destRootPath+'/sourcePath'ifos.path.exists(destCopyPath):shutil.rmtree(destCopyPath)shutil.copytree(sourcePath,destCopyPath)自己写如果用循环代替copytreeimportosimportshutilimportconfigparser#Create读取对象的配置文件cf=configparser.ConfigParser()#获取当前文件夹的绝对路径path=os.path.dirname(__file__)#print(path)#加载配置文件cf.read(path+"/config.ini")#readpathsourcePath=cf.get('filePath','sourcePath')destRootPath=cf.get('filePath','destPath')#destCopyPath=destRootPath+'/sourcePath'如果不是操作系统。path.isdir(sourcePath):print('源路径不是文件夹')exit(0)#判断是否有之前的文件,如果有则清除firstDirName=os.path.basename(sourcePath)ifos.path.exists(os.path.join(destRootPath,firstDirName)):shutil.rmtree(os.path.join(destRootPath,firstDirName))forroot,dirs,filesinos.walk(sourcePath):#当前源路径的最后一个文件夹名称currentRootFirstDir=os.path.basename(root)ifnotos.path.exists(os.path.join(destRootPath,currentRootFirstDir)):#在目标路径的最后一层创建一个文件夹os.mkdir(os.path.join(destRootPath,currentRootFirstDir))destRootPath=os.path.join(destRootPath,currentRootFirstDir)#为childDirindirs创建该层下的所有文件夹:destChildDirPath=os.path.join(destRootPath,childDir)os.mkdir(destChildDirPath)#为childFileinfiles创建所有文件:shutil.copy(os.path.join(root),childFile),destRootPath)Python遍历一个文件夹中的所有对象,逐层显示。循环中root是当前级路径,dirs是当前路径下所有文件夹的列表,files是所有文件的listos。.path.basename(str)方法是获取参数路径的最后一层名称。
