shutil模块 python,python中shutil模块的用法
Os模块和shutil文件操作模块是Python中常用的标准库。本文将通过实例详细讲解它们的用法,有兴趣的朋友可以跟边肖一起学习。
00-1010系统模块常用方法常用属性文件操作路径模块文件复制移动模块(文件操作)copyfileobj - copyfile - Copyfile(内容)Copy mode-Copy stat-Copy 2-Copy tree-迭代复制文件夹中的所有rmtrees迭代删除文件夹(即使文件夹中有文件)move -移动文件或文件夹。
目录
导入操作系统
该模块用于操作系统。
系统模块
os常用的方法有几十种,本文只选取了最常用的几种,其余都是权限操作、删除和创建文件等详细信息。可以参考官方文件。
system -- 执行系统命令
参数的数据类型为字符串格式,内容为系统指令。执行时,直接返回系统输出。
导入操作系统
Os.system(ifconfig) # Linux系统shell命令
Os.system(ipconfig) # Windows系统dos命令
popen -- 执行系统命令
使用system执行系统命令时,发现在windows系统下执行命令时汉字乱码!这是因为windows对中文系统使用GB格式编码以减少占用,而python默认使用UTF-8编码,导致代码乱码。
Popen也可以执行系统指令,但它的工作方式与system不同。
Popen在执行系统指令后返回对象,通过内置方法read读取字符串。在这个过程中,read方法自动将其他代码转换为UTF-8格式,因此popen比System具有更高的可读性和兼容性。
但在实际使用过程中发现,popen并没有出现堵塞的情况,即在执行一些长时间的系统任务时,python代码会在没有等待系统任务结束的情况下继续执行,从而导致某些场景下出现问题。比如我的一个场景,我想删除一个文件夹里的一个文件,然后重写一个文件。使用popen不会删除该文件,代码会继续执行,从而写入新文件。此时popen删除我新写的文件,导致我的程序出现bug。所以如果没有可读性要求,我建议先用system方法。
导入操作系统
obj=os.popen(ipconfig )
res=obj.read()
打印(分辨率)
listdir -- 获取指定文件夹中的所有文件
获取指定文件夹中的所有文件(包括文件和文件夹),并以列表形式返回文件名。默认为当前路径。
导入操作系统
#默认为当前路径
files=os.listdir()
打印(文件)
#可以使用相对和绝对路径
files=os.listdir(C: )
打印(文件)
walk -- 递归遍历目录
递归遍历指定的目录,包括其所有子目录,并返回一个迭代器对象。迭代器一次返回一个元组,它有三个元素:
第一个元素是一个字符串,表示当前的目录路径;第二个元素是一个列表,表示当前目录下的所有文件夹名(不包括子目录下的);第三个元素是一个列表,表示当前遍历目录下的所有文件名(不包括子目录下的);主要参数
请看下例,目录结构如下:
import ospath = rC:\Users\MSR\Desktop\test
# 正序遍历
res = os.walk(path) # 返回迭代器
for i in res:
print(i)
r"""
(C:\\Users\\MSR\\Desktop\\test, [1, 2], [root.txt])
(C:\\Users\\MSR\\Desktop\\test\\1, [111], [1.txt])
(C:\\Users\\MSR\\Desktop\\test\\1\\111, [], [11.txt])
(C:\\Users\\MSR\\Desktop\\test\\2, [], [2.txt])
"""
# 倒序遍历(优先展示最深子目录)
res = os.walk(path, topdown=False)
for i in res:
print(i)
r"""
(C:\\Users\\MSR\\Desktop\\test\\1\\111, [], [11.txt])
(C:\\Users\\MSR\\Desktop\\test\\1, [111], [1.txt])
(C:\\Users\\MSR\\Desktop\\test\\2, [], [2.txt])
(C:\\Users\\MSR\\Desktop\\test, [1, 2], [root.txt])
"""
getcwd -- 获取当前工作路径
import os# 获取当前的工作路径
dir_path = os.getcwd()
print(dir_path) # E:\0-project\python\test
# 获取当前文件的路径
file_path = __file__ # 使用内置属性__file__获取
print(file_path) # E:/0-project/python/test/test3.py
注意:getcwd()获取的使用当前工作路径,__file__是获取当前文件的路径。
对于这个注意事项,大家一定要铭记于心,因为我被人欺骗了,当然这应该算是pycharm的坑吧!
注意了,文件的所在路径和工作路径是不相同的,文件的所在路径就是在系统中的这个脚本文件实实在在的地址,如果这个文件在C:\
下,那么在任何的情况下这个文件的所在路径都是C:\
;而工作路径不同,如果我们在C:\
下执行这个python文件,那么我们的工作路径就是C:\
,如果我们是在D:\
下执行,那么我们的工作路径就是D:\
,这就是文件所在地址和工作地址的区别,但是在一般情况下,我们执行文件都是在文件的所在地址执行的,所以大部分的时候文件所在路径和当前工作路径都是相同的。
可我在最开始学习这个方法的时候,我的老师教我说getcwd()
的作用是获取文件的所在路径,那么是什么让我一直以为getcwd()
的作用是获取文件的所在路径呢?是老师教给我的……感觉这个老师很不靠谱?那么老师怎么没有发现其中的含义呢?我怎么又一直深信不疑呢?我觉得这个一定是要pycharm来背锅了!我们在学习的时候一般都是相信自己的实际操作的结果的,我们执行的结果是什么,反复那么几次,我们的印象就会加深!
然后今天2021年12月7日20:58:09
我在给公司的项目写一个启动脚本,目的是为了避免使用繁琐的命令去启动关闭项目,那么我在写的时候为了能够在系统的任何一个地方都是可以使用这个脚本,所以将命令中的各种路径全部写为绝对路径,我们系统工程师对绝对路径是非常熟练的!但是在我写好使用的时候就发现程序根本就启动不起来,已启动就死掉了,我就开始找原因,后来我发现在程序的目录下启动就没有问题,在其它的地址启动就有问题,我就意识到这是路径的错误。当然我们是有日志的,我看日志说是配置文件相关的地方出现了错误,我一看,就很好奇,配置文件是在程序的目录中的,读取的时候使用相对路径来获取,但是却没有读到文件,但是我检查之后文件是存在的!那么这个问题就很明显了,工作路径出了问题。
但是我还疑惑,为什么会影响到相对路径吗?然后我就测试了getcwd,发现果然如此,getcwd返回的不是文件的所在地址而是当前所在的工作地址,这个时候我还不死心,因为当时老师说的不是这样,所以我以为是linux和windows的差异,所以我就咋爱windows中又测试了一遍,发现还是一样的。那么我就又疑惑了,怎么在pycharm中,工作路径始终都是文件的所在路径呢?然后我就发现原来pycharm中可以指定文件的工作路径,而且默认将当前的文件路径作为工作路径使用。
然后我看文档介绍:Return a unicode string representing the current working directory.
,emmm估计当时老师也是被pycharm坑了吧。所以大家以后如果想要在程序中固定工作路径,可以在启动文件中使用__file__
获取,或者使用os.chdir
方法。
然后最后还是在强调一下:工作路径会影响到相对路径的使用,但是不会影响到sys.path
python的环境变量。
chdir -- 修改当前工作路径
之前我们有学过很多的函数,他们在涉及到路径的时候,一般默认情况都是当前脚本文件所在的目录(比如刚才的listdir
、getcwd
),如果将文件的默认工作路径修改,就会影响到其它的一些功能,比如说我们导入文件使用相对路径等,所以,谨慎使用。
import os# 在修改默认工作路径前使用
print(os.getcwd()) # E:\0-project\python\test
# chdir 修改当前文件工作的默认路径
os.chdir(C:)
# 在修改工作路径后使用
print(os.getcwd()) # C:\
access -- 测试权限
用于测试一个指定路径或者文件的权限,返回True或者False。
语法:os.access(path, mode)
必要参数为path和mode,分别表示路径和测试的权限类型。
urandom -- 随机字节对象
返回包含适合加密使用的随机字节的bytes对象。
import os# 参数为字节长度
key = os.urandom(1)
print(key, len(key))
# b\x92 1
key = os.urandom(5)
print(key, len(key))
# b\xde\x05/lh 5
getpid&getppid -- 获取进程和父进程
getpid
用于返回当前程序(脚本文件)的进程ID,getppid
用于返回当前程序(脚本文件)的父进程ID。
# 获取进程唯一ID(PID)import os
# getpid 返回当前进程的ID
print(os.getpid()) # 10784
# getppid 返回父进程的ID
# 如果父进程已退出,Windows计算机仍将运行返回其id;其他系统将返回“init”进程的id;
print(os.getppid()) # 16468
cpu_count -- 获取CPU核心数(逻辑)
import osprint(os.cpu_count())
"""
结果:
8
"""
常用属性
enciron -- 操作环境变量
import os# 获取系统的所有环境变量
ev_var = os.environ
print(ev_var)
# 获取系统指定的环境变量
path_ev_var = os.environ[PATH]
print(path_ev_var)
# 添加环境变量
os.environ[PATH] += r:/home/msr # Linux使用冒号分隔
os.environ[PATH] += r;C:\Users\MSR # Windows使用分号分隔
# 其实可以看到,环境变量其实就是一个特殊的字典,修改环境变量就是在操作一个字典数据而已
name & sep & linesep
import os# name 获取系统标识(Linux ->posix windows -> nt)
print(os.name) # nt
# sep 获取路径分隔符号
print(os.sep) # \
# linesep 获取系统的换行符号
print(repr(os.linesep)) # \r\n
文件操作
mknod & remove -- 新建&删除文件
windows系统不支持此方法。
import osos.mknod(test.txt)
os.remove(test.txt)
mkdir & rmdir -- 创建&删除文件夹
import osos.mkdir(test_dir)
os.rmdir(test_dir)
rename -- 重命名文件或文件夹
语法:rename(old_path, new_path)
import osos.rename(test.txt, hahaha.txt)
makedirs & removedirs -- 迭代创建&删除文件夹
import os# 迭代创建文件夹
os.makedirs(a/b/c/d/e)
# 迭代删除文件夹(文件夹中存在文件,则该文件夹不删除)
os.removedirs(a/b/c/d/e)
路径模块
import os.path
路径模块也是系统模块中的一部分。
basename -- 返回路径中的文件名部分
import os.path# 该路径不一定真实存在
file_path = r..\学习笔记\day1笔记.py
file_name = os.path.basename(file_path)
print(file_name) # day1笔记.py
dirname -- 返回路径中目录部分
import os.pathfile_path = r..\学习笔记\day1笔记.py
dir_path = os.path.dirname(file_path)
print(dir_path) # ..\学习笔记
split -- 将目录和文件名拆分成两部分
import os.pathfile_path = r..\学习笔记\day1笔记.py
tuple_var = os.path.split(file_path)
print(tuple_var) # (..\\学习笔记, day1笔记.py)
print(type(tuple_var)) # 返回元组: <class tuple>
join -- 将多个路径组合在一起
import os.pathpath1 = abc
path2 = 123
path3 = main.py
# 使用join组合
path = os.path.join(path1, path2, path3)
print(path) # abc\123\main.py
# 也可以使用 os.sep
path = path1 + os.sep + path2 + os.sep + path3
print(path) # abc\123\main.py
splitext -- 将文件名分为文件名和后缀名
import os.path# 分开文件名
file_name = main.py
res = os.path.splitext(file_name)
print(res) # (main, .py)
print(type(res)) # <class tuple>
# 分来完整路径
file_path = r..\学习笔记\day1笔记.py
res = os.path.splitext(file_path)
print(res) # (..\\学习笔记\\day1笔记, .py)
print(type(res)) # <class tuple>
# 也可以使用字符串内置方法 split 实现
res = file_path.split(.)
print(res) # [, , \\学习笔记\\day1笔记, py]
print(type(res)) # <class list>
getsize -- 获取指定文件的大小
import os.path# 获取指定文件的大小(单位:byte)
file_size_byte = os.path.getsize(test.txt)
getctime -- 获取文件的创建时间
获取文件的创建时间,返回时间戳。(windows有明确的创建时间,linux只有最后一次的修改时间。)
import os.pathimport time
# 获取文件创建时间
stamp_time = os.path.getctime(./test.py)
print(stamp_time) # 1613989768.3445127
# 配合 时间模块使用 获取时间
print(time.ctime(stamp_time)) # Mon Feb 22 18:29:28 2021
getmtime -- 获取文件的最后一次修改时间
import os.pathimport time
# 获取文件最后一次修改时间
stamp_time = os.path.getmtime(./test.py)
print(stamp_time) # 1614037683.1067748
# 配合 时间模块使用 获取时间
print(time.ctime(stamp_time)) # Tue Feb 23 07:48:03 2021
getatime -- 获取文件最后一次访问时间
import os.pathimport time
# 获取文件最后一次访问时间
stamp_time = os.path.getatime(./test.py)
print(stamp_time) # 1635590737.799415
# 配合 时间模块使用 获取时间
print(time.ctime(stamp_time)) # Sat Oct 30 18:45:37 2021
isdir & isfile & islink -- 检查路径类型
不检查路径是否真实存在。
import os.path# 检查路径类型,返回布尔值:
# 不是对应类型或没有相应文件 : False
# 是对应类型:True
# isdir 检查路径是否是文件夹
res = os.path.isdir(test.txt)
# isfile 检查路径是否是文件
res = os.path.isfile(test.txt)
# islink 检查路径是否是链接
res = os.path.islink(test.txt)
isabs -- 检查路径是否是绝对路径
不检查路径是否真实存在
import os.path# 检查windows路径
path = rE:\小黄片
res = os.path.isabs(path)
print(res) # True
# windows系统检查Linux路径
path = r/root/home
res = os.path.isabs(path)
print(res) # True
abspath -- 相对路径转成绝对路径
先检查一个路径是否是相对路径,是则将其转成绝对路径,反之不变。
转成绝对路径的规则是:以当前的工作路径为基准,根据相对路径中的相对级别,将对应级别的工作路径替换为原路径中的相对路径。
不检查路径是否真实存在。
import os.path# 绝对路径不改变
path = rE:\学习资料
new_path = os.path.abspath(path)
print(new_path) # E:\学习资料
# 相对路径转成绝对路径
path = r..\学习资料
new_path = os.path.abspath(path)
print(new_path) # E:\0-project\python\学习资料
# 根据级别自动转换
path = r..\..\学习资料
new_path = os.path.abspath(path)
print(new_path) # E:\0-project\学习资料
# 如果相对的级别过多,就以根目录为准(不会报错)
path = r..\..\..\..\..\..\..\..\..\..\学习资料
new_path = os.path.abspath(path)
print(new_path) # E:\学习资料
exists -- 检查路径是否真实存在
检查路径是否真实存在,返回布尔值。
import os.path# 检查指定路径是否存在
path = rE:\小黄片
res = os.path.exists(path)
print(res) # False
文件复制移动模块(文件操作)
import shutil
用于对文件进行操作。
获取文件信息,获取文件信息,见系统模块。
copyfileobj -- 复制文件(内容)
只复制文件的内容,通过文件IO操作,将一个文件的对象复制到另一个文件对象当中,因为需要在文件IO对象中操作,所以不推荐使用。
语法:copyfileobj(fsrc, fdst, length=16*1024)
copyfileobj(被复制文件对象,新文件对象,一次性读取字符数量。)
import shutilwith open(test.txt, r, encoding=UTF-8) as fp1 :
with open(test2.txt, w, encoding=UTF-8) as fp2 :
shutil.copyfileobj(fp1, fp2)
copyfile -- 复制文件(内容)
底层调用copyfileobj
,使用方便快捷,所以推荐使用。
语法:copyfile(被复制文件路径, 新文件路径)
import shutilshutil.copyfile(test.txt, test2.txt)
copymode -- 复制文件(权限)
仅复制文件的权限,不复制文件的内容(被赋值权限的文件必须存在),语法和copyfile
相同。
import shutilshutil.copymode(test.txt, test.txt)
copystat -- 复制文件(除了内容)
复制文件的所有的状态信息,包括各种日期、权限……就是没有内容。
import shutilshutil.copystat(test.txt, test.txt)
copy & copy2 -- 复制文件
import shutil# 复制文件内容和权限
shutil.copy(test.txt, test.txt)
# 完整复制整个文件(包括状态、权限、内容……)
shutil.copy2(test.txt, test.txt)
copytree -- 迭代复制文件夹中的所有
import shutilshutil.copytree(../学习笔记, ../学习笔记备份)
rmtree -- 迭代删除文件夹(即使文件夹中有文件)
import shutilshutil.rmtree(..\小黄片)
move -- 移动文件或文件夹
import shutilshutil.move(D:\学习资料, C:\我的心血)
以上就是详解Python常用标准库之os模块与shutil模块的详细内容,更多关于Python os模块 shutil模块的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。