一、 目录

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)

  1. 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])

  1. path代表要拼接的文件路径,可以是相对路径也可以是绝对路径,路径之间用逗号分隔;
  2. 如果要拼接的路径有多个绝对路径,那么以从左到右最后出现的一个为准,且该路径之前的参数都将被忽略。
  3. 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)

  1. path为要检测文件的路径,可以是相对路径,也可以是绝对路径。
  2. 结果返回一个布尔值,True or False
print(os.path.exists(r'C:\\demo\123.txt')) # False

1.2.5 创建目录

① 创建一级目录:os.mkdir(path, mode=0o777)

  1. 一次只能创建一级目录
  2. path为要创建目录的路径,可以是相对路径,也可以是绝对路径
  3. mode用于指定数值模式,默认为0o777,在非UNIX系统上无效或被忽略
  4. 如果要创建目录的上一级目录不存在,会抛出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)

  1. 一次可以创建多级目录
  2. path为要创建目录的路径,可以是相对路径,也可以是绝对路径
  3. mode用于指定数值模式,默认为0o777,在非UNIX系统上无效或被忽略
  4. 同样,如果要创建目录的上一级目录不存在,会抛出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)

  1. path为要删除的目录路径,可以是相对路径,也可以是绝对路径
  2. 只有当要删除的目录为空时才有效
  3. 如果要删除的目录不存在,会抛出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])

  1. top指要遍历的根目录
  2. topdown为遍历顺序,是自上而下(从根目录开始)还是自下而上(从最后一级目录开始),自上而下为True,反之为False,默认为True
  3. 返回一个元组生成器对象,包含三个元素,dirpath, dirnames, filenames。其中dirpath表示当前遍历的路径,是一个字符串;dirnames表示当前路径下包含的子目录(也可以理解为文件夹),是一个列表;filenames表示当前路径下包含的文件,也是一个列表。
  4. 最后,可以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)

  1. path为要删除文件的路径,可以是相对路径,也可以是绝对路径
  2. 如果要删除的文件不存在,会抛出FileNotFoundError异常

2.2.2 重命名文件/目录

语法:os.rename(src,dst)

  1. 既可以重命名文件,也可以重命名目录
  2. src是原来目录和文件的路径,dst是修改后的目录和文件的路径
  3. 不止可以更改名字,甚至可用于更改位置
  4. 同样,需要提前判断文件是否存在,不存在将抛出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)

  1. path:你想要检查权限的文件或目录的路径。
  2. mode:你想要检查的权限模式,它是一个或多个权限标志的按位或组合。
  3. 结果返回一个布尔值,如果具有指定的访问权限,则返回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表示有写入执行、权限,没有访问权限。

欢迎指正~