经常需要批量操作文件夹及文件路径,遂汇总一下Python操作文件夹目(foulder)及文件(file path)的函数以便速查。常用的几个内置模块:os 、glob 及shutil ,包括:文件路径 的批量-读取、重命名、删除、复制、移动 以及目录 的创建、重命名、删除、移动。结合条件判断可以实现各类操作。
导入模块,其他的内置模块还有pathlib ,fnmatch ,可以相结合实现更多条件的操作。
1 2 3 import os, fnmatchfrom glob import globimport shutil
最常用的代码是,输出所有指定后缀的绝对路径
1 files = glob(path+"\\*.csv" )
文件目录操作(dir)
1 2 >>> os.path.isdir(mydir) >>> os.path.exists(mydir)
创建,用于自动新建文件而非手动
1 2 3 4 5 6 def create_dir (cwd ): if not os.path.exists(cwd): os.makedirs(cwd) return cwd outpath = create_dir(path+"\\res" ) outfile = outpath+str ()
删除os.rmdir(path)
,移动见下文,与文件相同shutil.move()
文件路径操作(file)
判断是否为文件或者是否存在,结合if判断是否执行对应操作
1 2 >>> os.path.isfile(myfile) >>> os.path.exists(myfile)
测试文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 C:\Users\huangs\Desktop\test │ 20170101.txt │ 20170102.txt │ 20170103.csv │ tree.txt ├─dir1 │ 20170103.txt │ 20170104.txt ├─dir2 │ ├─北京 │ │ 北京.csv │ │ │ └─江西 │ 上饶.csv │ 九江.csv │ 南昌.csv ... │ └─dir3
读取文件
os.listdir()
读取路径下所有的文件和目录,不带根目录;
glob.glob()
则输出绝对路径,并且可以指定后缀
os.path.split(path)
,os.path.basename()
及os.path.splitext()
获取文件名及后缀等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 path = r"C:\Users\huangs\Desktop\test" >>> os.listdir(path)['20170101.txt' ,'20170102.txt' ,'20170103.csv' , 'dir1' ,'dir2' , 'dir3' ] >>> files = [os.path.join(path,file) for file in os.listdir(path)]>>> files['C:\\Users\\huangs\\Desktop\\test\\20170101.txt' , 'C:\\Users\\huangs\\Desktop\\test\\20170102.txt' , 'C:\\Users\\huangs\\Desktop\\test\\20170103.csv' , 'C:\\Users\\huangs\\Desktop\\test\\dir1' , 'C:\\Users\\huangs\\Desktop\\test\\dir2' , 'C:\\Users\\huangs\\Desktop\\test\\dir3' ] >>> glob(path+"/*" )['C:\\Users\\huangs\\Desktop\\test\\20170101.txt' , 'C:\\Users\\huangs\\Desktop\\test\\20170102.txt' , 'C:\\Users\\huangs\\Desktop\\test\\20170103.csv' , 'C:\\Users\\huangs\\Desktop\\test\\dir1' , 'C:\\Users\\huangs\\Desktop\\test\\dir2' , 'C:\\Users\\huangs\\Desktop\\test\\dir3' ] >>> [file for file in glob(path+"/*" ) if os.path.isfile(file)]['C:\\Users\\huangs\\Desktop\\test\\20170101.txt' , 'C:\\Users\\huangs\\Desktop\\test\\20170102.txt' , 'C:\\Users\\huangs\\Desktop\\test\\20170103.csv' ] >>> glob(path+"/*.txt" )['C:\\Users\\huangs\\Desktop\\test\\20170101.txt' ,'C:\\Users\\huangs\\Desktop\\test\\20170102.txt' ]
输出指定嵌套层的文件
1 2 3 4 >>> glob(path+"/*/*/*.csv" )['C:\\Users\\huangs\\Desktop\\test\\dir2\\北京\\北京.csv' , 'C:\\Users\\huangs\\Desktop\\test\\dir2\\江西\\上饶.csv' , 'C:\\Users\\huangs\\Desktop\\test\\dir2\\江西\\九江.csv' , ...]
获取文件信息等
1 2 3 4 5 6 7 >>> file = r'C:\\Users\\huangs\\Desktop\\test\\dir2\\江西\\上饶.csv' >>> os.path.split(file)('C:\\\\Users\\\\huangs\\\\Desktop\\\\test\\\\dir2\\\\江西' , '上饶.csv' ) >>> os.path.splitext(file)[-1 ]'.csv' >>> os.path.basename(file)'上饶.csv'
删改重命名移动复制
os. rename + remove
1 2 3 4 5 6 7 import osos.rename(src, dst,...) os.rename(filename, new_filename) for file in files: if '.csv' in file: os.remove(file)
移动shutil.move(src, dst)
,如将指定目录的文件移动到新目录
1 2 3 4 5 6 7 8 import shutildef move_files (indir, outdir ): filenames = os.listdir(indir) files = [indir+"\\" +file for file in filenames] newfiles = [outdir+"\\" +file for file in filenames] for i in range (len (files)): shutil.move(files[i], newfiles[i]) move_files(r"C:\Users\huangs\Desktop\test\dir2" , r"C:\Users\huangs\Desktop\test\dir1" )
复制文件shutil.copy(source, destination)
1 2 3 4 source = r"C:\Users\huangs\Desktop\test\dir2\a.png" destination = r"C:\Users\huangs\Desktop\test\dir3\a.png" shutil.copy(source, destination)