《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情




操作文件和目录

阅读:227568034    分享到

我们平时在电脑上操作(读,写,删除,复制等等)文件和目录,主流的操作系统(带界面的 linux 系统,mac 系统,windows 系统等等)不但都有提供友好的可视化操作,也提供命令行操作。

无论是可视化操作还是通过命令行操作,最终都是转化为程序调用操作系统的 API 函数对文件和目录进行操作。

本节课我们来学习 Python 内置的操作文件和目录的函数。

windows 和 linux 命令行操作文件和目录

如果我们要操作文件或目录,可以在命令行下面输入操作系统提供的各种命令来完成,比如 linux下的 pwd 显示当前路径, ll 和 ls 显示当前目录下的文件和文件夹,rm 删除文件,mv 移动文件等等。

Windows 下的 dir 命令显示当前目录下的文件和文件夹,copy 复制文件,move 移动文件,del 删除当前路径下的文件等等。

对于操作系统提供的操作文件和目录的命令,大家用到时可以自行搜索,我们下面重点学习如何用 Python 提供的函数来操作文件和目录。

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 操作目录的函数

我们可以使用 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 目录下没有文件和目录,否则会报异常

如何删除一个存在的非空目录以及更复杂的目录操作,后面我们会介绍更高级的模块来完成这些操作。

Python 操作文件名和目录名的函数

把目录和文件进行路径拼接时,如果直接拼字符串,我们还要判断操作系统,因为在 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')

使用高级模块 shutil 操作文件和路径

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文件。


如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
lanjunfu
2020年6月14日 20:09 回复
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')

user_image
lanjunfu
2020年6月14日 20:08 回复

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')


user_image
lookas2001
2019年7月25日 03:25 回复

os.listdir()是列出该目录下所有文件吗 为什么会有我在资源管理器上看不到的文件被列出来?


user_image
貔卡貅
2019年2月23日 22:31 回复

看懂了40%