0. 简介
python内部有两类常见的针对文件以及文件夹进行操作的函数库,分别为os库以及shutil库。
这里,我们通过一些常见的文件操作的实现代码样例来简单介绍一下上述两个库中的一些常用函数。
给出os以及shutil的官方文档如下:
1. 文件路径操作
这里,我们首先来考察文件路径的操作。
给出其应用场景如下:
- 我们已知一个文件的路径,要查询其上级目录或者其文件后缀;
- 或者反之,已知文件名以及文件所在的目录,合成文件的完整路径。
- 查询当前执行脚本所在的绝对路径。
当然,一种暴力的手法自然是自己使用字符串操作的方式进行暴力解决,这种方式自然快速且方便,但是其代价在于缺乏泛用性,因为windows与linux操作系统针对文件的分隔符是不同的,前者使用反斜杠\
,后者则是用斜杠/
。
因此,更为规范的操作方式是通过python的os库来进行操作。
下面,我们分别来考察上述几种场景的实现:
1. 查询当前执行脚本所在的路径
查询当前执行脚本所在的路径可以通过os.getcwd()
命令或者os.path.abspath()
命令来进行实现。
import os
# 实现方式一:
path = os.getcwd()
# 实现方式二:
path = os.path.abspath(".")
其中,os.path.abspath()
函数的使用方式会更为灵活,通过修改其中的输入,我们还可以获取比如上级路径在内容的其他路径地址。
比如:
import os
# 获取上级目录:
path = os.path.abspath("..")
# 获取上上级目录:
path = os.path.abspath("../..")
2. 获取文件所在的目录
对应一个传入的文件完整路径,如果我们要获取其所在目录名,我们可以通过os.path.split()
方法进行实现。
而后,获得路径名之后,我们即可对其进行后续操作。
给出代码样例如下:
import os
path = "/data/user/folder/test.txt"
folder, filename = os.path.split(path)
# ["/data/user/folder", "test.txt"]
如此,我们就可以获取文件的文件名以及文件所处的文件目录。
3. 获取文件的后缀名
那么,如果是要获取文件名或者文件的后缀需要怎么处理呢?
os库同样提供了os.path.splitext
方法来实现上述功能。其示例代码如下:
import os
file = "test.txt"
filename, suffix = os.path.splitext(file)
# ["test", ".txt"]
4. 合成文件路径
有时候,我们需要在某一目录下写入某一名称的文件。这时,我们就要首先合成出目标文件的绝对路径。
os库可以使用os.path.join
方法来实现上述功能。
给出其代码样例如下:
import os
path = "/data/user/folder"
filename = "test.txt"
filepath = os.path.join(path, filename)
# "/data/user/folder/test.txt"
2. 文件操作
这里,我们来考察一下文件的操作。
python中进行文件操作我们可以采用shutil库进行实现。
shutil库是一个更为高级的文件操作库,通过shutil库,我们可以实现文件的复制、移动、删除等功能。
1. 文件的基础判断
对于给出的一个路径,我们需要判断其是否为一个文件,文件是否存在,是否可以访问等,在python中,我们使用os库中的下列方法进行实现。
-
判断路径是否为文件
import os os.path.isfile("tmp/tmp.txt")
当且仅当路径存在且为一个文件的路径时,返回为True。
-
判断文件存在与否
import os os.path.exists("tmp/tmp.txt")
-
查询文件操作权限
import os # 查询读权限 os.access("tmp/tmp.txt", mode=os.R_OK) # 查询写权限 os.access("tmp/tmp.txt", mode=os.W_OK) # 查询读写权限 os.access("tmp/tmp.txt", mode=os.X_OK)
2. 复制文件
python进行文件复制操作的代码比较简单。可以使用如下方式:
import shutil
src = "/data/user/folder/src.txt"
tgt = "/data/user/folder/tgt.txt"
# 方法一:
shutil.copy(src, tgt)
# 方法二:
shutil.copyfile(src, tgt)
# 方法三:
shutil.copy2(src, tgt)
# 方法四:
shutil.copyfileobj(open(src), open(tgt, "w+"))
参考stackoverflow中的说明,上述四种方法的区别在于如下:
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│ Function │ Copies │ Copies │Can use│ Destination │
│ │metadata│permissions│buffer │may be directory│
├──────────────────┼────────┼───────────┼───────┼────────────────┤
│shutil.copy │ No │ Yes │ No │ Yes │
│shutil.copyfile │ No │ No │ No │ No │
│shutil.copy2 │ Yes │ Yes │ No │ Yes │
│shutil.copyfileobj│ No │ No │ Yes │ No │
└──────────────────┴────────┴───────────┴───────┴────────────────┘
3. 移动文件
python中要对文件进行剪切只需要使用shutil库中的shutil.move
函数即可实现。
给出代码样例如下:
import shutil
src = "tmp/src.txt"
tgt = "tmp/tgt.txt"
shutil.move(src, tgt)
4. 删除文件
而有关文件的删除,我们只需要使用os库中的remove
函数即可实现。
给出代码样例如下:
import os
os.remove("tmp/test.txt")
3. 文件夹的操作
1. 文件夹的判断
对于一个给定的路径,如果我们要判断其是否为一个文件夹,则我们只需要调用os库中的isdir
方法即可。
给出代码样例如下:
import os
path = "tmp/tmp"
os.path.isdir(path)
2. 文件夹的遍历
python进行文件夹的遍历通常使用os库函数,其常见的实现方式包括以下两种:
-
os.listdir(path)
os.listdir方法会以一个list的方式返回路径下的所有的文件以及文件夹的名称。
import os os.listdir("tmp")
需要注意的是,
listdir
方法只会返回下一级目录中的文件以及文件夹名称,不会进行递归访问。 -
os.walk()
如果想要递归地访问目录下的所有子目录中的所有文件,则我们可以使用os.walk方法,其代码样例如下:
import os def my_op(filepath): pass folder = "./tmp/" for root, dirs, files in os.walk(folder): for file in files: my_op(os.path.join(root, file))
3. 文件夹的创建
而另一方面,在python中,如果要创建文件夹,则我们可以使用os.makedirs
方法,它可以自行创建目标文件夹及其路径上所需要的所有根目录。
给出代码样例如下:
import os
os.makedirs("tmp/tmp", exist_ok=True)
需要注意的是,exist_ok
参数的默认值为False,它会在目标目录已存在时抛出异常。因此,通常我们需要将其手动设置为True。
4. 文件夹的剪切
当我们要对一个文件夹进行剪切操作时,我们往往需要递归地对其目录下的所有文件进行剪切操作。
此时,我们可以通过shutil库中的move
函数直接实现,其代码完全同上述文件的剪切方法,这里不再赘述。
5. 文件夹的复制
如果我们要递归地对一个文件夹进行复制,则我们可以使用shutil库中的copytree方法进行实现。
给出代码样例如下:
import shutil
src = "tmp/src/"
tgt = "tmp/tgt/"
shutil.copytree(src, tgt)
6. 文件夹的删除
同样的,如果要递归地对一个文件夹进行完整的删除操作,则我们可以使用shutil库中的rmtree方法,其代码样例如下:
import shutil
shutil.rmtree("tmp/tmp/")