26.Python文件I/Oos模块&shutil模块详解
Posted 孤寒者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了26.Python文件I/Oos模块&shutil模块详解相关的知识,希望对你有一定的参考价值。
目录:
每篇前言:
🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者
- 🔥🔥本文已收录于Python全栈系列专栏:《Python全栈基础教程》
- 🔥🔥热门专栏推荐:《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《爬虫高级》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
- 📝📝本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
- 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
Python文件I/O(四)
1.1 os模块方法
os 模块提供了非常丰富的方法用来处理文件和目录。
常用方法示例:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os
# 重命名文件test1.txt为test2.txt。
os.rename( "test1.txt", "test2.txt" )
# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")
# 创建目录test
os.mkdir("test")
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os
# 给出当前的目录
print(os.getcwd())
#显示当前目录的所有文件名
print(os.listdir(os.getcwd()))
# 将当前目录改为"E:"
os.chdir("E:")
# 给出当前的目录
print(os.getcwd())
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os
# rmdir()方法删除目录,目录名称以参数传递。
# 在删除这个目录之前,它的所有内容应该先被清除。
os.rmdir("/tmp/hive")
如果/tmp/hive目录里有内容,则会抛出异常:
Traceback (most recent call last):
File "***/os.py", line 7, in <module>
os.rmdir("/tmp/hive")
WindowsError: [Error 145] : '/tmp/hive'
1.1.1 os递归删除目录
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os
def rmDirs(dirPath):
for root, dirs, files in os.walk(dirPath, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir(dirPath)
rmDirs("E:")
1.1.2 os常用的方法
1.1.3 os.walk()深入讲解
os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下。
walk()方法语法格式如下:
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
参数:
- top – 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名】。
- topdown --可选,为True或者没有指定, 一个目录的的3-元组将比它的任何子文件夹的3-元组先产生 (目录自上而下)。如果topdown为 False, 一个目录的3-元组将比它的任何子文件夹的3-元组后产生 (目录自下而上)。
- onerror – 可选,是一个函数; 它调用时有一个参数, 一个OSError实例。报告这错误后,继续walk,或者抛出exception终止walk。
- followlinks – 设置为 true,则通过软链接访问目录。
输出指定目录下所有文件以及文件夹名字:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os
for root, dirs, files in os.walk("E:"):
# 所有文件
for name in files:
print(os.path.join(root, name))
# 所有目录
for name in dirs:
print(os.path.join(root, name))
1.1.4 树形显示目录
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os
def show_dir(dir, layer=0):
listdir = os.listdir(dir)
for index, file in enumerate(listdir):
file_path = os.path.join(dir, file)
print("| " * (layer - 1), end="")
if (layer > 0):
print("--" if index == len(listdir) - 1 else "|--", end="")
print(file)
if (os.path.isdir(file_path)):
show_dir(file_path, layer + 1)
show_dir(r'E:\\pycharm_pro\\www')
1.1.5 os.path常用方法
注意:
路径拼接: os.path.join(path1,path2….)
a = os.path.join(r'C:\\my\\python',r'pycharm_work') # 注意第二个以及更多的路径前不能加反斜杠
print(a) # 输出为:C:\\my\\python\\pycharm_work
实战讲解:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os
print(os.path.basename('/root/test/tmp.txt')) # 返回文件名
print(os.path.dirname('/root/test/tmp.txt')) # 返回目录路径
print(os.path.split('/root/test/tmp.txt')) # 分割文件名与路径
print(os.path.splitext('/path/to/file.txt')) # 拆分文件扩展名
print(os.path.join('root', 'aaa', 'tmp.txt')) # 将目录和文件名合成一个路径
输出文件的相关信息:
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import os,time
file = 'CSDN_lotto.py' # 文件路径
print(os.path.getatime(file)) # 输出最近访问时间
print(os.path.getctime(file)) # 输出文件创建时间
print(os.path.getmtime(file)) # 输出最近修改时间
print(time.gmtime(os.path.getmtime(file))) # 以struct_time形式输出最近修改时间
print(os.path.getsize(file)) # 输出文件大小(字节为单位)
print(os.path.abspath(file)) # 输出绝对路径
print(os.path.normpath(file)) # 规范path字符串形式
2.1 Shutil的常用用法
shutil是 python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建、删除、查看等方法,还提供了对文件以及目录的路径操作。shutil模块提供了移动、复制、 压缩、解压等操作,恰好与os互补,共同一起使用,基本能完成所有文件的操作。是一个非常重要的模块。
- shutil.rmtree递归删除目录
- shutil.copytree递归复制目录
- shutil.copy复制文件
2.1.1 文件夹与文件操作
copyfileobj(fsrc, fdst, length=16*1024): 将fsrc文件内容复制至fdst文件,length为fsrc每次读取的长度,用做缓冲区大小。
- fsrc: 源文件
- fdst: 复制至fdst文件
- length: 缓冲区大小,即fsrc每次读取的长度
copyfile(src, dst, follow_symlinks=True): 将src文件内容复制至dst文件
- src: 源文件路径
- dst: 复制至dst文件,若dst文件不存在,将会生成一个dst文件;若存在将会被覆盖
- follow_symlinks:设置为True时,若src为软连接,则当成文件复制;如果设置为False,复制软连接。默认为True。Python3新增参数~
copymode(src, dst, follow_symlinks=True): 将src文件权限复制至dst文件。文件内容,所有者和组不受影响。
- src: 源文件路径
- dst: 将权限复制至dst文件,dst路径必须是真实的路径,并且文件必须存在,否则将会报文件找不到错误
- follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~
copystat(src, dst, follow_symlinks=True): 将权限,上次访问时间,上次修改时间以及src的标志复制到dst。文件内容,所有者和组不受影响。
- src: 源文件路径
- dst: 将权限复制至dst文件,dst路径必须是真实的路径,并且文件必须存在,否则将会报文件找不到错误
- follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限、上次访问时间,上次修改时间以及src的标志,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~
copy(src, dst, follow_symlinks=True): 将文件src复制至dst。dst可以是个目录,会在该目录下创建与src同名的文件,若该目录下存在同名文件,将会报错提示已经存在同名文件。权限会被一并复制。本质是先后调用了copyfile与copymode而已
- src:源文件路径
- dst:复制至dst文件夹或文件
- follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~
copy2(src, dst, follow_symlinks=True): 将文件src复制至dst。dst可以是个目录,会在该目录下创建与src同名的文件,若该目录下存在同名文件,将会报错提示已经存在同名文件。权限、上次访问时间、上次修改时间和src的标志会一并复制至dst。本质是先后调用了copyfile与copystat方法而已
- src:源文件路径
- dst:复制至dst文件夹或文件
- follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限、上次访问时间,上次修改时间以及src的标志,如果设置为True,则当成普通文件复制权限。默认为True。Python3新增参数~
ignore_patterns(*patterns): 忽略模式,用于配合copytree()方法,传递文件将会被忽略,不会被拷贝。
- patterns:文件名称,元组
copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False): 拷贝文档树,将src文件夹里的所有内容拷贝至dst文件夹
- src:源文件夹
- dst:复制至dst文件夹,该文件夹会自动创建,需保证此文件夹不存在,否则将报错
- symlinks:是否复制软连接,True复制软连接,False不复制,软连接会被当成文件复制过来,默认False
- ignore:忽略模式,可传入ignore_patterns()
- copy_function:拷贝文件的方式,可以传入一个可执行的处理函数,默认为copy2,Python3新增参数
- ignore_dangling_symlinks:sysmlinks设置为False时,拷贝指向文件已删除的软连接时,将会报错,如果想消除这个异常,可以设置此值为True。默认为False,Python3新增参数~
rmtree(path, ignore_errors=False, οnerrοr=None): 移除文档树,将文件夹目录删除
- ignore_errors:是否忽略错误,默认False
- onerror:定义错误处理函数,需传递一个可执行的处理函数,该处理函数接收三个参数:函数、路径和excinfo
move(src, dst, copy_function=copy2): 将src移动至dst目录下。若dst目录不存在,则效果等同于src改名为dst。若dst目录存在,将会把src文件夹的所有内容移动至该目录下面
- src:源文件夹或文件
- dst:移动至dst文件夹,或将文件改名为dst文件。如果src为文件夹,而dst为文件将会报错
- copy_function:拷贝文件的方式,可以传入一个可执行的处理函数。默认为copy2,Python3新增参数
disk_usage(path): 获取当前目录所在硬盘使用情况。Python3新增方法
- path:文件夹或文件路径。windows中必须是文件夹路径,在linux中可以是文件路径和文件夹路径
chown(path, user=None, group=None): 修改路径指向的文件或文件夹的所有者或分组。Python3新增方法
- path:路径
- user:所有者,传递user的值必须是真实的,否则将报错no such user
- group:分组,传递group的值必须是真实的,否则将报错no such group
which(cmd, mode=os.F_OK | os.X_OK, path=None): 返回当给定的 cmd 被调用时将要运行的可执行文件的路径。 如果没有 cmd 会被调用则返回 None。
-
mode 是一个传递给 os.access() 的权限掩码,在默认情况下将确定文件是否存在并且为可执行文件。
-
当未指定 path 时,将会使用 os.environ() 的结果,返回 “PATH” 的值或回退为 os.defpath。
-
在 Windows 上当前目录总是会被添加为 path 的第一项,无论你是否使用默认值或提供你自己的路径,这是命令行终端在查找可执行文件时所采用的行为方式。 此外,当在 path 中查找 cmd 时,还会检查 PATHEXT 环境变量。 例如,如果你调用 shutil.which(“python”),which() 将搜索 PATHEXT 来确定它要在 path 目录中查找 python.exe。 例如,在 Windows 上:
>>> shutil.which("python")
'C:\\\\Python33\\\\python.EXE'
2.1.2 归档操作
shutil还提供了创建和读取压缩和存档文件的高级使用程序。内部实现主要依靠的是zipfile和tarfile模块。
make_archive(base_name, format, root_dir, …): 生成压缩文件。
- base_name:压缩文件的文件名,不允许有扩展名,因为会根据压缩格式生成相应的扩展名
- format:压缩格式
- root_dir:将指定文件夹进行压缩
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import shutil,os
base_name = os.path.join(os.getcwd(),"aaa")
format = "zip"
root_dir = r"D:\\PycharmProjects\\demo1\\numpytest"
# 将root_dir文件夹下的内容进行压缩,生成一个aaa.zip文件
shutil.make_archive(base_name, format, root_dir)
get_archive_formats(): 获取支持的压缩文件格式。目前支持的有:tar、zip、gztar、bztar。在Python3还多支持一种格式xztar。
unpack_archive(filename, extract_dir=None, format=None): 解压操作。Python3新增方法
- filename:文件路径
- extract_dir:解压至的文件夹路径。文件夹可以不存在,会自动生成
- format:解压格式,默认为None,会根据扩展名自动选择解压格式
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import shutil,os
zip_path = os.path.join(os.getcwd(),"aaa.zip")
extract_dir = os.path.join(os.getcwd(),"test")
shutil.unpack_archive(zip_path, extract_dir)
get_unpack_formats(): 获取支持的解压文件格式。目前支持的有:tar、zip、gztar、bztar和xztar。Python3新增方法。
拓展:
文件访问编码:
文件内容:
adafsd
asdfasdfd
sadfdsfds
sdafdsf
吴某
你真帅
hello
例子:::
with open(‘shuju.txt’,‘r+’,encoding =‘ASCII’,errors = ‘ignore’) as f:
# 如果非想用ASCII编码方法打开一个包含中文的文件
#(ASCII只能打开英文和数字,打开中文会报错因为解不了中文)
# 那么就加个errors = ‘ignore’ 这样就会忽略错误,直接跳过中文部分
print(f.read())
输出为:
adafsd
asdfasdfd
sadfdsfds
sdafdsf
hello
以上是关于26.Python文件I/Oos模块&shutil模块详解的主要内容,如果未能解决你的问题,请参考以下文章
2018-06-26-Python全栈开发day22-part1-os,json,sys,pickle,shelve模块介绍