我们平时在电脑上操作(读,写,删除,复制等等)文件和目录,主流的操作系统(带界面的 linux 系统,mac 系统,windows 系统等等)不但都有提供友好的可视化操作,也提供命令行操作。
无论是可视化操作还是通过命令行操作,最终都是转化为程序调用操作系统的 API 函数对文件和目录进行操作。
本节课我们来学习 Python 内置的操作文件和目录的函数。
如果我们要操作文件或目录,可以在命令行下面输入操作系统提供的各种命令来完成,比如 linux下的 pwd 显示当前路径, ll 和 ls 显示当前目录下的文件和文件夹,rm 删除文件,mv 移动文件等等。
Windows 下的 dir 命令显示当前目录下的文件和文件夹,copy 复制文件,move 移动文件,del 删除当前路径下的文件等等。
对于操作系统提供的操作文件和目录的命令,大家用到时可以自行搜索,我们下面重点学习如何用 Python 提供的函数来操作文件和目录。
我们可以使用 Python 内置的 os 模块提供的函数来检查一个文件是否存在。
import os flag = os.path.exists("d:/test.txt") print(flag) # 如果文件存在返回 True,否则返回 False
我们上节课学习的写文件操作中,可以用标识符 'w' 打开一个不存在文件,我们可以使用这种方法来创建一个文件, 但要注意,我们最好在创建文件时检查一下是否存在有重名的文件,如果存在就不要创建,否则的话会把原来的文件给冲掉。
import os if not os.path.exists("d:/test.txt"): # 如果文件不存在 f = open("d:/test.txt", "w") # 在 d 盘下创建一个 test.txt 文件 f.close() else: print("文件已存在,请换个文件名")
我们可以使用 Python 内置的 os 模块提供的函数来删除一个文件,如果删除的文件不存在 Python 解释器会报异常。
import os if os.path.exists("d:/test.txt"): # 如果文件存在 os.remove("d:/test.txt") # 删除 d 盘下的 test.txt 文件 else: print("要删除的文件不存在")
我们可以使用 Python 内置的 os 模块提供的函数来给一个存在的文件重命名,要确保被命名的文件存在以及新命名的文件名不存在,否则Python 解释器会报异常。
import os if os.path.exists("d:/test.txt") and not os.path.exists("d:/newtest.txt"): os.rename("d:/test.txt", "d:/newtest.txt") else: print("不存在该文件或重命名的文件名已存在")
我们还需要对文件进行拷贝,移动等等操作,后面我们会介绍更高级的模块来完成这些操作。
我们可以使用 Python 内置的 os 模块提供的函数,查看当前文件所在目录的全路径。
import os print(os.path.abspath("."))
我们可以使用 Python 内置的 os 模块提供的函数,在已经存在的目录下创建一个新目录。
import os os.mkdir("d:/test/tt") # 要确保 d:/test/ 目录存在,否则会报异常
我们可以使用 Python 内置的 os 模块提供的函数,删除一个存在的空目录(该目录下没有文件和目录)。
import os os.rmdir("d:/test/tt") # 要确保 d:/test/tt 目录下没有文件和目录,否则会报异常
如何删除一个存在的非空目录以及更复杂的目录操作,后面我们会介绍更高级的模块来完成这些操作。
把目录和文件进行路径拼接时,如果直接拼字符串,我们还要判断操作系统,因为在 Linux/Unix/Mac 下,os.path.join 函数返回的字符串是用 "/" 衔接的,在 windows 下,os.path.join 函数返回的字符串是用 "\" 衔接的。我们可以使用 Python 内置的 os 模块的函数进行智能拼接路径。
import os filepath = "d:/img" # 我们在项目开发中一般不会使用绝对路径,在此只是为了举例说明 filename = "ruhua.png" ''' 注意: 1.filepath 中的字符串中的目录不要求在系统中存在,我们拼接的 filepath 和 filename 仅仅只是字符串拼接而已 2.我们 定义的 filepath 仅仅是在 windows 下做测试,实际项目开发中,我们不会用这种绝对路径的方式,因为我们 的项目很有可能部署在不同的操作系统上,那样的话我们还要修改连接符 '\\' 或者 '/' 来对应我们的操作系统,这 显然不符合软件工程的理念。 3.所以下面这条语句在 windows 下会拼接成 "d:/img\ruhua.png",在 linux 下会拼接成 "d:/img/ruhua.png", 我们想要的拼接是字符串 "d:/test" 和 字符串 "ruhua.png" 的拼接,所以实现了智能拼接。 ''' print(os.path.join(filepath, filename))
我们要拆分一个已存在文件或目录的全路径时,也不要直接去拆字符串,我们可以使用 Python 内置的 os 模块的函数,这样可以把一个路径拆分为两部分放在一个 tuple 里面,tuple 中的第二个值总是最后级别的目录或文件名。
import os allfilepath = "d:/img/head/ruhua.png" # 不要求系统中存在该路径,拆分的仅仅是字符串 print(os.path.split(allfilepath)) # 返回值为 ('d:/img/head', 'ruhua.png')
我们可以使用 Python 内置的 os 模块的函数得到文件扩展名,同样我们操作的对象是字符串,并不要求这个路径存在。
import os allfilepath = "d:/img/head/ruhua.png" # 不要求系统中存在该路径,拆分的仅仅是字符串 print(os.path.splitext(allfilepath)) # 返回值为 ('d:/img/head/ruhua', '.png')
Python 内置的 os 模块只提供基本的文件操作,对于一些复杂的操作,比如对文件的拷贝操作, 删除非空文件夹等等,我们可以我们可以使用高级模块比如 shutil 模块。
import shutil shutil.copy("d:/test.txt", "d:/testcp.txt") # 拷贝文件 shutil.rmtree("d:/testdir") # testdir 是非空文件夹
当然即使我们不使用 shutil 模块,使用 Python 提供的 os 模块也可以实现拷贝文件,删除非空文件夹等等所有的对文件的操作,其实 shutil 模块里面也是调用 os 模块来完成这些复杂的文件操作。
熟练使用 os 模块对文件和目录进行操作
熟练使用 shutil 模块以及其它第三方模块对文件进行操作。
列出某个非空目录下所有的.py文件。
import os def disAllPyFlie(dirpath): l1=os.listdir(dirpath) for item in l1: if os.path.isdir(dirpath+'/'+item): disAllPyFlie(dirpath+'/'+item) elif item.contains('.py'): print(item) disAllPyFlie('D:/aa')
os.listdir()是列出该目录下所有文件吗 为什么会有我在资源管理器上看不到的文件被列出来?
看懂了40%