Python文件路径及目录批处理

经常需要批量操作文件夹及文件路径,遂汇总一下Python操作文件夹目(foulder)及文件(file path)的函数以便速查。常用的几个内置模块:osglobshutil,包括:文件路径批量-读取、重命名、删除、复制、移动以及目录的创建、重命名、删除、移动。结合条件判断可以实现各类操作。

导入模块,其他的内置模块还有pathlibfnmatch,可以相结合实现更多条件的操作。

1
2
3
import os, fnmatch
from glob import glob
import shutil

最常用的代码是,输出所有指定后缀的绝对路径

1
files = glob(path+"\\*.csv")

文件目录操作(dir)

1
2
>>> os.path.isdir(mydir)  # True/False
>>> os.path.exists(mydir) # True/False

创建,用于自动新建文件而非手动

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)  # True/False
>>> 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 os
os.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 shutil
def 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)
#