5.4 文件对象常用的方法
方法名 | 说明 |
read([size]) | 从文件中读取 size 个字节或字符的内容返回。若省略 [size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入到列表返回 |
write(str) | 将字符串 str 内容写入文件 |
writelines(s_list) | 将字符串列表 s_list 写入文本文件,不添加换行符 |
seek(offset[, whence]) |
把文件指针移动到新的位置,offset 表示相对于 whence 的位置:offset:为正往结束方向移动,为负往开始方向移动;whence 不同的值代表不同含义:0:从文件头开始计算(默认值);1:从当前位置开始计算;2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
下面的代码请读者自己于本地运行输出结果:
file = open('a.txt', 'r', encoding='utf-8') print(file.read()) file.close()
file = open('a.txt', 'r', encoding='utf-8') print(file.read(3)) file.close()
file = open('a.txt', 'r', encoding='utf-8') print(file.readline()) file.close()
file = open('a.txt', 'r', encoding='utf-8') print(file.readlines()) file.close()
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 23:40 # 欢迎大家关注AIoT相关博客~ file = open('c.txt', 'w', encoding='utf-8') file.write('hello 辰chen') list = ['Python', 'C', 'C++', 'Java', 'go'] file.writelines(list) file.close()
运行结束后,c.txt 的内容为:
hello 辰chenPythonCC++Javago
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 23:51 # 欢迎大家关注AIoT相关博客~ file = open('a.txt', 'r', encoding='utf-8') file.seek(3) # 注意,如果采用utf-8,因为中文占3个字节,故如果你的文件内容是汉字,需为3的倍数 # 上一行代码其实就是跳过第一个汉字,从第二个汉字开始 print(file.read()) file.close()
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 9:14 # 欢迎大家关注AIoT相关博客~ file = open('b.txt', 'r', encoding='utf-8') file.seek(3) print(file.read()) print(file.tell()) file.close()
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 9:21 # 欢迎大家关注AIoT相关博客~ file = open('b.txt', 'w', encoding='utf-8') file.write('hello') file.flush() file.write(' world') # 程序不报错,flush操作后仍能继续写入内容 file.close()
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 9:21 # 欢迎大家关注AIoT相关博客~ file = open('b.txt', 'w', encoding='utf-8') file.write('hello') file.close() file.write(' world') # 程序报错,close操作后不能继续写入内容 file.flush()
5.5 with语句(上下文管理器)
🚩with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的
我们直接上代码:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 9:36 # 欢迎大家关注AIoT相关博客~ with open('a.txt','r', encoding='utf-8') as file: print(file.read())
可以看出,在使用了 with 语句之后,我们可以不用手写 close,会自动关闭文件资源。
with 语句的使用语法:
with open() as 文件名 语句体 当然也有: with 类方法 as 对象 一个类对象,实现了\_\_enter\_\_(),\_\_exit\_\_()这两个特殊方法 称这个类对象遵守上下文管理协议,而这个类的实例对象被称为上下文管理器 我们把 with 语句之后的,as语句之前的:open(), 类方法 被称为上下文表达式,结果为上下文管理器
下面我们用一个类对象去介绍:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 9:36 # 欢迎大家关注AIoT相关博客~ ''' MyContentMgr实现了特殊方法__enter__(),__exit__()称为该类对象遵守了上下文管理器协议 该类对象的实例对象,称为上下文管理器 ''' class MyContentMgr(object): def __enter__(self): print('enter方法被调用执行了') return self def __exit__(self, exc_type, exc_val, exc_tb): print('exit方法被调用执行了') def show(self): print('show方法被调用执行了') with MyContentMgr() as file: #相当于file=MyContentMgr() file.show()
我们在最开头说过,无论什么原因跳出 with 块,都能确保文件正常的关闭,即不论发生什么,我们都会执行__enter__(),__exit__(),我们来给上述代码搞点破坏,看看能不能还执行这两个特殊方法:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 9:36 # 欢迎大家关注AIoT相关博客~ ''' MyContentMgr实现了特殊方法__enter__(),__exit__()称为该类对象遵守了上下文管理器协议 该类对象的实例对象,称为上下文管理器 ''' class MyContentMgr(object): def __enter__(self): print('enter方法被调用执行了') return self def __exit__(self, exc_type, exc_val, exc_tb): print('exit方法被调用执行了') # 在 show() 中加入 1 / 0 def show(self): print('show方法被调用执行了', 1 / 0) with MyContentMgr() as file: #相当于file=MyContentMgr() file.show()
可以看到,虽然抛出异常,但是我们的 enter方法和exit方法还是执行了。
我们在后续涉及到文件处理的时候,要尽量去使用 with语句。
5.6 目录操作
1.os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
2.os模块与os.path模块用于对目录或文件进行操作
5.6.1 os模块
🚩os模块操作目录相关函数
函数 | 说明 |
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
makedirs(path1/path2...[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2......) | 删除多级目录 |
chdir(path) | 将path设置为当前工作目录 |
这些函数如果你学过 linux,那么你会觉得很熟悉,其实也没什么区别,只不过是用 Python 去使用了一些操作指令,大家可以自行在 PyCharm 中调用这些函数,这里不再赘述。
执行操作系统的内容:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 10:17 # 欢迎大家关注AIoT相关博客~ # os模块与操作系统相关的一个模块 import os os.system('notepad.exe') # 打开记事本 os.system('calc.exe') # 打开计算器 # 直接调用可执行文件 os.startfile('D:\\QQ\\Bin\\QQScLauncher.exe') # 第11行代码为打开QQ,需要找到你的QQ安装位置才可以打开,注意转义字符需要 \\
5.6.2 os.path模块
🚩os.path模块操作目录相关函数
函数 | 说明 |
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在,如果存在返回 True,否则返回False |
join(path, name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdit(path) | 用哦关于判断是否为路径 |
函数结果演示:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 10:53 # 欢迎大家关注AIoT相关博客~ import os.path print(os.path.abspath('OsPath.py')) print(os.path.exists('OsPath.py'),os.path.exists('666.py')) print(os.path.join('E:\\pythonProject', 'OsPath.py')) print(os.path.split('E:\\pythonProject.py\\chap2\\Document\\OsPath.py')) print(os.path.splitext('OsPath.py.py')) print(os.path.basename('E:\\pythonProject.py\\chap2\\Document\\OsPath.py')) print(os.path.dirname('E:\\pythonProject.py\\chap2\\Document\\OsPath.py')) print(os.path.isdir('E:\\pythonProject.py\\chap2\\Document\\OsPath.py'))
列出指定目录下的所有 py 文件:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 10:57 # 欢迎大家关注AIoT相关博客~ import os path=os.getcwd() lst=os.listdir(path) for filename in lst: if filename.endswith('.py'): print(filename)
walk() 方法:递归遍历所有的文件:可以把指定目录下的子目录文件也一一列举出来。
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/2 11:05 # 欢迎大家关注AIoT相关博客~ import os path = os.getcwd() lst_files = os.walk(path) for dirpath, dirname, filename in lst_files: ''' print(dirpath) print(dirname) print(filename) print('----------------------------------') ''' for dir in dirname: print(os.path.join(dirpath, dir)) for file in filename: print(os.path.join(dirpath, file)) print('----------------------------------')