一、 目录
1.1 常见概念
1.1.1 目录和路径
- 目录:又称“文件夹”,是用于组织和分类文件的结构元素。目录中常包含文件和其他目录,用以形成一个层次性的文件结构。
- 路径:路径是描述文件或目录在文件系统中位置的一个字符串。通过路径,我们可以定位到文件具体位置,其中根据是否依赖当前工作目录,路径可以分为绝对路径和相对路径。
1.1.2 相对路径和绝对路径
- 当前工作目录:当前文件所在的目录。
# 查看当前工作目录
import os
print(os.getcwd()) # C:\Users\li\PycharmProjects\pythonProject
- 相对路径:依赖于当前工作目录的路径。如果文件与当前文件在同个文件夹下,就可以通过相对目录访问,否则,只能通过绝对目录访问。如:
# 如,访问当前工作目录下的“123.txt”文件,可以直接写作:
with open('123.txt', 'r') as file # 其中'123.txt'是相对路径
# 如,访问当前工作目录下的子目录info下的'123.txt'文件,可以写作:
with open('info\\123.txt', 'r') as file
"""
在Windows系统中,文件路径常用反斜杠\作为分隔符
但在Python中,\是转义符,所以常用双反斜杠\\,或者正斜杠/,或者字符串前加r(R)表示字符串中的\不是转义符。如:
"""
with open('info\\123.txt', 'r') as file
with open('info/123.txt', 'r') as file
with open(r'info\123.txt', 'r') as file
- 绝对路径:从根目录出发的完整路径,提供了从根目录到目标文件或目录的完整路线,不依赖于当前工作目录。无论在文件系统哪个位置,都可以依据绝对路径定位到目标位置。
# 获取绝对路径
print(os.path.abspath(r'info\123.txt')
# 通过绝对路径打开文件
with open(r'C:\Users\li\PycharmProjects\pythonProject\123.txt', 'r') as file:
pass
1.1.3 os模块
os模块是Python内置的与操作系统功能和文件系统相关的模块,当我们需要操作文件和目录时,常用到os模块和其子模块os.path提供的函数。
1.2 常见操作
1.2.1 查看当前工作目录
print(os.getcwd())
1.2.2 获取绝对路径
语法:os.path.abspath(path)
- path为要获取绝对路径的相对路径,可以是文件,也可以是目录
print(os.path.abspath(r'pythonProject\123.txt') # C:\Users\liuxi\PycharmProjects\pythonProject\123.txt
1.2.3 拼接路径
语法:os.path.join(path1, [path2], [path3]..., [pathn])
- path代表要拼接的文件路径,可以是相对路径也可以是绝对路径,路径之间用逗号分隔;
- 如果要拼接的路径有多个绝对路径,那么以从左到右最后出现的一个为准,且该路径之前的参数都将被忽略。
- join函数在拼接路径时,并不会检测路径是否真实存在
print(os.path.join('C:\\code','info\123.txt')) # C:\code\info\123.txt
print(os.path.join('C:\\demo', 'D:\\', '456.txt', 'E:\\demo\\123.txt')) # E:\demo\123.txt
1.2.4 判断目录是否存在
语法:os.path.exists(path)
- path为要检测文件的路径,可以是相对路径,也可以是绝对路径。
- 结果返回一个布尔值,True or False
print(os.path.exists(r'C:\\demo\123.txt')) # False
1.2.5 创建目录
① 创建一级目录:os.mkdir(path, mode=0o777)
- 一次只能创建一级目录
- path为要创建目录的路径,可以是相对路径,也可以是绝对路径
- mode用于指定数值模式,默认为0o777,在非UNIX系统上无效或被忽略
- 如果要创建目录的上一级目录不存在,会抛出FileNotFoundError:系统找不到指定路径;如果要创建的目录已存在,则会抛出FileExistsError:当文件已存在时,无法创建该文件
import os
os.mkdir(r'C:\Users\li\PycharmProjects\pythonProject\456.txt')
Tips:如何处理FileNotFoundError异常:
# 可以通过try...except捕捉异常
try:
os.mkdir(path)
except FileNotFoundError as e:
print(e)
# 或者提前判断路径是否存在
if not os.path.exists(path):
os.mkdir(path)
else:
print(.)
② 创建多级目录:os.makedirs(path, mode=0777)
- 一次可以创建多级目录
- path为要创建目录的路径,可以是相对路径,也可以是绝对路径
- mode用于指定数值模式,默认为0o777,在非UNIX系统上无效或被忽略
- 同样,如果要创建目录的上一级目录不存在,会抛出FileNotFoundError:系统找不到指定路径;如果要创建的目录已存在,则会抛出FileExistsError:当文件已存在时,无法创建该文件
os.makedirs(r'C:\Users\liuxi\PycharmProjects\pythonProject\123\456\789.txt')
print(os.path.abspath(r'123\456\789.txt')) # C:\Users\liuxi\PycharmProjects\pythonProject\123\456\789.txt
os.makedirs(r'123\456\000.txt')
print(os.path.abspath(r'123\456\000.txt')) # C:\Users\liuxi\PycharmProjects\pythonProject\123\456\000.txt
1.2.6 删除目录
语法:os.rmdir(path)
- path为要删除的目录路径,可以是相对路径,也可以是绝对路径
- 只有当要删除的目录为空时才有效
- 如果要删除的目录不存在,会抛出FileNotFoundError异常
import os
os.rmdir(r'123\456\789.txt')
# 执行一次删除,再执行会报错,因为找不到指定的文件了
- 如果要删除不为空的目录,可以用shutil模块的rmtree函数
import shutil
shutil.rmtree(r'123\456\000.txt')
1.2.7 遍历目录
遍历目录,指将指定目录下的所有子目录和文件运行一遍,可以用walk()函数
语法:os.walk(top, [topdown])
- top指要遍历的根目录
- topdown为遍历顺序,是自上而下(从根目录开始)还是自下而上(从最后一级目录开始),自上而下为True,反之为False,默认为True
- 返回一个元组生成器对象,包含三个元素,dirpath, dirnames, filenames。其中dirpath表示当前遍历的路径,是一个字符串;dirnames表示当前路径下包含的子目录(也可以理解为文件夹),是一个列表;filenames表示当前路径下包含的文件,也是一个列表。
- 最后,可以for循环输出遍历后的结果
print(os.path.abspath(r'123\456\789.txt'))
print(os.path.abspath(r'123\456\000.txt'))
tuples = os.walk(r'123')
for i in tuples:
print(i)
"""
C:\Users\liuxi\PycharmProjects\pythonProject\123\456\789.txt
C:\Users\liuxi\PycharmProjects\pythonProject\123\456\000.txt
('123', ['456'], [])
('123\\456', ['000.txt', '789.txt'], [])
('123\\456\\000.txt', [], [])
('123\\456\\789.txt', [], [])
"""
1.3 os目录函数总结
os | |
获取当前工作目录 | os.getcwd() |
创建目录 | os.mkdir() |
创建多级目录 | os.makedirs() |
删除目录 | os.rmdir() |
删除多级目录 | os.removedirs() |
把path设置为当前工作目录 | os.chdir(),类似Linux的cd命令 |
返回指定路径下的文件和目录信息 | os.listdir(),类似Linux的ls命令 |
遍历目录树 | os.walk() |
os.path | |
获取文件或者目录的绝对路径 | os.path.abspath() |
拼接路径 | os.path.join() |
确定路径是否存在 | os.path.exists() |
确定路径是否是一个目录 | os.path.isdir() |
从一个路径中提取文件名 | os.path.basename() |
从一个路径中提取文件路径,不含文件名 | os.path.dirname() |
二、高级文件操作
2.1 os文件函数总结
os | |
检查当前用户权限 | os.access(path,mode) |
删除文件 | os.remove() |
重命名文件或目录 | os.rename(src,dst) |
查看指定文件的信息 | os.stat() |
修改文件权限 | os.chmod(path,mode) |
2.2 常见操作
2.2.1 删除文件
语法:os.remove(path)
- path为要删除文件的路径,可以是相对路径,也可以是绝对路径
- 如果要删除的文件不存在,会抛出FileNotFoundError异常
2.2.2 重命名文件/目录
语法:os.rename(src,dst)
- 既可以重命名文件,也可以重命名目录
- src是原来目录和文件的路径,dst是修改后的目录和文件的路径
- 不止可以更改名字,甚至可用于更改位置
- 同样,需要提前判断文件是否存在,不存在将抛出FileNotFoundError异常
# 重命名文件
if os.path.exists('123.txt'):
os.rename('123.txt', '010.txt')
# 重命名目录
if os.path.exists('123'):
os.rename('123', '000')
# 将文件移动到其他目录下并重命名
if os.path.exists('123.txt'):
os.rename('123.txt', r'000\010.txt')
2.2.3 查看文件的基本信息
语法:os.stat(path)
import os
print(os.stat('000.txt'))
"""
os.stat_result(st_mode=33206, st_ino=10414574138360536, st_dev=1484781234,
st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1715856262,
st_mtime=1715856262, st_ctime=1715855293)
"""
返回结果:
st_ino:索引号
st_dev:设备名
st_size:文件大小,单位字节Byte
st_atime:最后一次访问时间
st_mtime:最后一次更改时间
st_ctime:最后一次状态变化时间,Windows系统返回文件创建时间
其中:st_size返回字节数,1KB=1024Byte, 1MB=1024KB, 1GB=1024MB;默认返回结果的单位是字节Byte,可以视情况换算单位;
st_ctime等时间返回的是时间戳,可以用time模块的strftime()和localtime()函数转化为正常时间。
info = os.stat('000.txt')
print('文件大小:%.2f字节' % info.st_size)
print('最后一次访问时间:%s' % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(info.st_atime)))
print('最后一次修改时间:%s' % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(info.st_mtime)))
print('最后一次状态发生变化时间:%s' % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(info.st_ctime)))
"""
文件大小:0.00字节
最后一次访问时间:2024-05-16 18:44:22
最后一次修改时间:2024-05-16 18:44:22
最后一次状态发生变化时间:2024-05-16 18:28:13
"""
2.2.4 查看对文件是否有指定权限
os.access()函数用于检查调用进程的真实用户ID和真实组ID是否有对指定路径的访问权限。
语法:access(path, mode)
- path:你想要检查权限的文件或目录的路径。
- mode:你想要检查的权限模式,它是一个或多个权限标志的按位或组合。
- 结果返回一个布尔值,如果具有指定的访问权限,则返回True,否则返回False。
常见的权限标志包括:
os.F_OK:检查路径是否存在。
os.R_OK:检查路径是否可读。
os.W_OK:检查路径是否可写。
os.X_OK:检查路径是否可执行,对于文件而言,这通常不是很有用,但对于脚本或可执行文件来说是比较有用的。
print(os.access(r'000.txt', os.R_OK)) # True
print(os.access(r'000.txt', os.W_OK)) # True
print(os.access(r'000.txt', os.X_OK)) # True
print(os.access(r'000.txt', os.F_OK)) # True
2.2.5 修改文件权限
语法:os.chmod(path,mode)
mode: 格式:0o755
第一位数字:用户权限
第二位数字:组权限
第三位数字:其他用户权限
1-7分别表示不同权限级别,RWX
R:访问权限,有的话+4
W:写入权限,有的话+2
X:执行权限,有的话+1
所以,7表示4+2+1有访问、写入、执行权限,5表示有访问、执行权限,没有写入权限,3表示有写入执行、权限,没有访问权限。
欢迎指正~