其他
深度对比Python中4大文件/文件夹处理库,你更pick哪一个?
一、开篇
四大天王
。二、四大库各自好用的地方
文字叙述
为大家讲解这四大模块各自的用法,具体内容会在后面详细介绍。1. os库
os.getcwd():获取当前的工作路径; os.chdir() :改变当前工作目录到指定的路径; os.listdir(path):传入任意一个path路径,返回的是该路径下所有文件和目录组成的列表; os.mkdir():创建文件夹;
2. shutil库
shutil.copy(src,dst):复制文件,src表示源文件,dst表示目标文件夹; shutil.copytree(src,dst):复制文件夹,src表示源文件夹,dst表示目标文件夹; shutil.move(src,dst):移动文件/文件夹,src表示源文件/文件夹,dst表示目标文件夹; shutil.rmtree(src):删除文件夹,src表示源文件夹。区别这里和os模块中remove() 、rmdir()的用法、remove()方法只能删除某个文件,mdir()只能删除某个空文件夹。但是shutil模块中的rmtree()可以递归彻底删除非空文件夹;
3. glob库
*:匹配0个或多个字符; **:匹配所有文件、目录、子目录和子目录里的文件(3.5版本新增); ?:匹配一个字符; []:匹配指定范围内的字符,如[0-9]匹配数字,[a-z]匹配小写字母;
4. pathlib库
p.name:获取文件名; p.suffix:获取文件后缀;
三、os库
1. 模块的安装和导入
import os
2. os.getcwd()
作用:获取当前的工作路径;
3. os.listdir(path)
作用:传入任意一个path路径,返回的是该路径下所有 文件和目录
组成的列表;
os.listdir(path)
4. os.walk(path)
含义 :传入任意一个path路径,深层次遍历指定路径下的所有子文件夹,返回的是一个由路径、文件夹列表、文件列表组成的元组。我代码中写的方式属于 元组拆包
;元组拆包:就是将一个元组中的每个值,赋值给不同的变量;
for path,dirs,files in os.walk(path):
print(path)
print(dirs)
print(files)
print("\n")
5. os.path.exists(path)
含义:传入一个path路径,判断指定路径下的目录是否存在。存在返回True,否则返回False;
if os.path.exists(path1):
print("指定文件夹存在")
else:
print("指定文件夹不存在")
6. os.mkdir(path)
含义:传入一个path路径,创建单层(单个)文件夹; 注意:如果文件夹已经存在,就会报错。因此创建文件夹之前,需要使用os.path.exists(path)函数判断文件夹是否存在;
path1 = os.getcwd()+"\\huang_wei"
os.mkdir(path1)
7. os.makedirs(path)
含义:传入一个path路径,生成一个递归的文件夹; 注意:如果文件夹存在,就会报错。因此创建文件夹之前,需要使用os.path.exists(path)函数判断文件夹是否存在;
path1 = os.getcwd()+"\\huang_wei"
os.mkdir(path1)
8. os.rmdir(path)
含义:传入一个path路径,删除指定路径下的文件夹; 注意:该方法只能删除空文件夹,删除非空文件夹会报错;
os.rmdir(path1)
----------------------------------
path2 = os.getcwd()+"\\a\\b\\c"
os.rmdir(path2)
9. os.path.join(path1,path2)
含义:传入两个path路径,将该路径拼接起来,形成一个新的完整路径;
lis = ["a.jpg","b.jpg","c.jpg"]
for i in lis:
x = os.path.join(path,i)
print(x)
10. os.path.split(path)
含义:传入一个完整的path路径,将其拆分为 绝对路径
和文件名
2部分;
os.path.split(path1)
11. os.path.dirname(path)
含义:传入一个完整的文件路径,只获取其绝对路径;
os.path.dirname(path1)
12. os.path.basename(path)
含义:传入一个完整的文件路径,只获取其文件名;
os.path.basename(path1)
13. os.path.isdir(path)
含义:传入一个完整的文件路径,判断它是否是文件夹;
file_list = os.listdir()
for file in file_list:
if os.path.isdir(file):
print(file)
14. os.path.isfile(path)
含义:传入一个完整的文件路径,判断它是否是文件;
file_list = os.listdir()
for file in file_list:
if os.path.isfile(file):
print(file)
15. os.path.sep
含义:返回当前操作系统的路径分隔符;
16. os.path.getsize(path)
含义:传入一个完整的文件路径,返回该文件的大小;
四、shutil库
1. 模块导入
2. 复制文件
函数:shutil.copy(src,dst) 含义:复制文件; 参数:src表示源文件,dst表示目标文件夹; 注意:当移动到一个不存在的“目标文件夹”,系统会将这个不存在的“目标文件夹”识别为新的文件夹,而不会报错;
src = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a\data.txt"
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_b"
shutil.copy(src,dst)
------------------------------------------------------------
# 2.将a表的“data.txt”移动到b表,并重新命名为“new_data.txt”
src = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a\data.txt"
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_b\new_data.txt"
shutil.copy(src,dst)
------------------------------------------------------------
# 3.将a表的“data.txt”移动到“不存在”的文件夹
src = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a\data.txt"
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_c"
shutil.copy(src,dst)
"""
注意:对于情况3,系统会默认将“test_shutil_c”识别为文件名,而不是按照我们认为的,移动到一个新的不存在的文件夹。
"""
3. 复制文件夹
函数:shutil.copytree(src,dst) 含义:复制文件夹; 参数:src表示源文件夹,dst表示目标文件夹; 注意:这里只能是移动到一个空文件夹,而不能是包含其他文件的非空文件夹,否则会报错PermissionError;
① 如果目标文件夹中存在其他文件,会报错;
src = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a"
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_b"
shutil.copytree(src,dst)
② 如果指定任意一个目标文件夹,则会自动创建;
src = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a"
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_c"
shutil.copytree(src,dst)
4. 移动文件或文件夹
函数:shutil.move(src,dst) 含义:移动文件/文件夹;-- 参数:src表示源文件/文件夹,dst表示目标文件夹; 注意:文件/文件夹一旦被移动了,原来位置的文件/文件夹就没了。目标文件夹不存在时,会报错;
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a"
shutil.move("a.xlsx",dst)
----------------------------------------------------------------
# 将a文件夹下的“a.xlsx”文件,移动到b文件夹中,并重新命名为“aa.xlsx”
src = r"C:/Users/黄伟/Desktop/publish/os模块/test_shutil_a\a.xlsx"
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_b\aa.xlsx"
shutil.move(src,dst)
5. 删除文件夹(慎用)
函数:shutil.rmtree(src) 含义:删除文件夹; 参数:src表示源文件夹; 注意:区别这里和os模块中remove()、rmdir()的用法,remove()方法只能删除某个文件,mdir()只能删除某个空文件夹。但是shutil模块中的rmtree()可以递归彻底删除非空文件夹;
src = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_c"
shutil.rmtree(src)
6. 创建和解压压缩包
zipobj.write():创建一个压缩包; zipobj.namelist():读取压缩包中的文件信息; zipobj.extract():将压缩包中的单个文件,解压出来; zipobj.extractall():将压缩包中所有文件,解压出来; shutil 模块对压缩包的处理是调用 ZipFile 和 TarFile这两个模块来进行的,因此需要导入这两个模块; 注意:这里所说的压缩包,指的是“.zip”格式的压缩包;
① 创建一个压缩包
import os
file_list = os.listdir(os.getcwd())
# 将上述所有文件,进行打包,使用“w”
with zipfile.ZipFile(r"我创建的压缩包.zip", "w") as zipobj:
for file in file_list:
zipobj.write(file)
② 读取压缩包中的文件信息
with zipfile.ZipFile("我创建的压缩包.zip", "r") as zipobj:
print(zipobj.namelist())
③ 将压缩包中的单个文件,解压出来
注意:目标文件夹不存在,会自动创建;
# 将压缩包中的“test.ipynb”文件,单独解压到a文件夹下
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a"
with zipfile.ZipFile("我创建的压缩包.zip", "r") as zipobj:
zipobj.extract("test.ipynb",dst)
④ 将压缩包中所有文件,解压出来;
注意:目标文件夹不存在,会自动创建;
# 将压缩包中的所有文件,解压到d文件夹下
dst = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_d"
with zipfile.ZipFile("我创建的压缩包.zip", "r") as zipobj:
zipobj.extractall(dst)
五、glob库
1. 支持4个常用的通配符
**
、? 、[ ]这三个通配符,那么它们到底是 什么意思呢?*:匹配0个或多个字符; **:匹配所有文件、目录、子目录和子目录里的文件(3.5版本新增); ?:代匹配一个字符; []:匹配指定范围内的字符,如[0-9]匹配数字,[a-z]匹配小写字母; 注意:这3个通配符的用法,将在讲函数的时候,一起带大家操作一遍;
2. glob库中主要的3个函数
glob.glob():返回符合匹配条件的所有文件的路径; glob.iglob():返回一个迭代器对象,需要循环遍历获取每个元素,得到的也是符合匹配条件的所有文件的路径; glob.escape():escape可以忽略所有的特殊字符,就是星号、问号、中括号,用处不大; recursive=False:代表递归调用,与特殊通配符 “**”
一同使用,默认为False,False表示不递归调用,True表示递归调用;
① glob()函数
glob.glob(path1)
path2 = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a\[0-9a-z].*"
glob.glob(path2)
② iglob()函数
a = glob.iglob(path1)
for i in a:
print(i)
③ escape()函数
*
只表示它本来的意思,而不再具有通配符的作用。glob.escape('t*')
3个通配符
、3个函数
即可。对于我们来说,glob库就是方便我们查找文件而诞生的,因此我们好好掌握glob()这一个函数,其实就够了,其它的知道、会用就行。六、pathlib库
1. 最重要的Path对象
文件、文件夹
处理方法,供我们调用。① 当前路径下的Path对象
p
② 任意指定路径下的Path对象
p
文件对象
,也可以是一个文件夹对象
。根据不同的对象,调用对应的方法,就可以很便捷的处理文件或文件夹。2. 获取文件的具体信息
p.stat()
3. 路径拼接
/
斜杠即可。p1 = p/'pathlib库'
p1
4. 获取上级目录
p.parent
p.parent.parent
5. 获取文件的具体信息
p.stat()
6. 获取指定路径下所有文件/文件夹的路径信息
for i in p.iterdir():
print(i)
7. 获取指定路径下"符合条件"文件的路径信息
file_list = p.glob('*.txt')
for file in file_list:
print(file)
① 方法一
file_list = p.glob('**/*.txt')
for file in file_list:
print(file)
② 方法二
file_list = p.rglob('*.txt')
for file in file_list:
print(file)
Ⅰ 不考虑嵌套文件夹中的文件,使用glob()方法; Ⅱ 考虑嵌套文件夹中的文件,使用rglob()方法;
8. 限制递归次数,访问嵌套文件夹
① 不限制递归次数
file_list = p.rglob('*.txt')
for file in file_list:
print(file)
② 限制递归次数
file_list = p.rglob('*.txt')
for i,file in enumerate(file_list):
if i <= 2:
print(file)
9. 判断当前路径是否存在某个文件或者文件夹
for i in p.iterdir():
print(i)
10. 创建文件夹
666.txt
这个文件,而不存在'b'这个文件夹,现在我们就来创建它。p1 = p/'b'
if not Path('C:/Users/Administrator/Desktop/python三剑客/pathlib库/b').exists():
p1.mkdir()
parents=True
参数。p1 = p/'嵌套第一层'/'嵌套第二层'
p1.mkdir(parents=True)
11. 判断某个路径是文件,还是文件夹
p.is_dir()
p.is_file()
12. 文件/文件夹重命名
p.rename("重命名_3.gif")
13. 获取文件的文件名和后缀
p.name
p.suffix
os库
、shutil库
、glob库
是互补的,我们要善于发挥各自的优势,充分利用它们的优势,帮助我们快速的操作文件和文件夹。2. 如何用Python分析股票收益率?
3. pprint漂亮的打印,强烈推荐大家学习这个库!
4. 数据分析方法论,大总结!
5. 有了这款Python神器,新手也会调试代码!6. Pandas与openpyxl库的 "完美" 融合!7. Python提取PDF简历中的信息,写入Excel
8. Linux系列:完美收官,一共22个课时!9. Python操作MySQL数据库!