文件操作
# 文件操作 ### 目录管理(os) - 示例: ```python import os # 执行命令 # 清屏 # os.system('cls') # 调出计算器 # os.system('calc') # 操作系统类型,nt表示windows,posix表示类unix # print(os.name) # 获取环境变量 # print(os.environ['path']) # print(os.environ.get('pathxx', 'default')) # 与上式等价 # print(os.getenv('pathxx', 'default')) print(os.getenv('xxx', 'default')) ``` - 查看当前工作目录 ```python print(os.getcwd()) ``` - 创建目录 ```python # 新建目录 # os.mkdir('test') # 不能创建中间目录,否则会失败 # os.mkdir('a/b/c') # 可以创建中间目录 os.makedirs('a/b/c') ``` - 删除目录 ```python # 删除目录 # os.rmdir('test') # 只能删除空目录,不能删除有内容的目录 os.rmdir('a') ``` - 重命名 ```python os.rename('test2', 'test') ``` - 查看文件信息 ```pytho stat = os.stat('01-os.py') print(stat.st_size) ``` - 查看指定目录内容 ```python print(os.listdir(os.getcwd())) ``` - path使用 ```python import os # 目录拼接 # print(os.path.join('abc/def', 'hello.py')) # 提取目录 # print(os.path.dirname('abc/def/hello.py')) # print(os.path.dirname('C:/Apache24/htdocs/code/day08')) # 提取文件 # print(os.path.basename('abc/def/hello.py')) # 切割路径与文件名 # dir, file = os.path.split("abc/def/hello.py") # print(dir, file) # 切割路径名与后缀 # print(os.path.splitext('abc/def/hello.py')) # print(os.path.splitext('hello.py')) # 判断文件是否存在,可以是目录 # print(os.path.exists('a')) # 判断是否是目录 # print(os.path.isdir('01-os.py')) # print(os.path.isdir('a')) # 判断是否是文件 # print(os.path.isfile('01-os.py')) # print(os.path.isfile('a')) # 获取文件大小,只适用于文件,不能是目录 print(os.path.getsize('01-os.py')) print(os.path.getsize('a')) ``` ### 文件管理 - 打开文件 - 示例 ```python fp = open('00-test.txt') ``` - 参数 ``` file:操作的文件名 mode:打开模式 encoding:编码方式,通常不指定,系统会自动识别 ``` - 打开方式 ``` r:只读方式,文件不存在会报错 w:只写方式,文件不存在则创建,存在则清空 a:追加方式,文件不存在则创建,存在则打开(不会清空内容),只能向末尾添加内容 r+:在r的基础上添加写的权限 w+:在w的基础上添加读的权限 a+:在a的基础上添加读的权限 在上面打开方式上添加一个字符'b',表示已二进制方式进行操作:rb、wb、ab、rb+、wb+、ab+ 说明:没有添加b的方式的打开,默认都是以字符串形式操作,带b的方式都是以bytes形式操作的 ``` - 编码方式 ``` ASCII:美国信息交换标准代码(128) ansi:扩展的ASCII(256) gb2312:中国的ansi gbk:扩充的gb2312 unicode:万国码,能够将所有国家的所有字符进行统一编码 utf-8:可变长度的unicode实现方案,并且对中文支持良好 ``` - 关闭文件 ```python fp.close() ``` - 文件读写 ```python # 判断是否可读 # print(fp.readable()) # 判断是否可写 # print(fp.writable()) # 读取指定长度内容,默认读取全部 # content = fp.read(5) # print(content) # 写操作 # fp.write('123') ``` - 操作位置 ```python # 获取文件操作位置 print(fp.tell()) # 设置操作位置 # 参数1:偏移量 # 参数2:参考位置,0表示开头,1表示当前位置,2表示文件末尾 # 当以bytes方式操作时没有问题,但是以str方式操作时只能设置从开头的偏移 fp.seek(-3, 2) ``` ### bytes类型 - 示例: ```python # s = b'hello' # print(s, type(s)) # 编码:str => bytes s = 'hello'.encode('utf-8') print(s) # 解码:bytes => str b = s.decode('utf-8') print(b) ``` ### 环境变量 - 设置:`set 名称=值` - 获取:`set 名称` - 代码: ```python # print(os.environ['path']) # print(os.environ.get('pathxx', 'default')) # 与上式等价 # print(os.getenv('pathxx', 'default')) print(os.getenv('xxx', 'default')) ``` ### 文件目录 - 目录分隔符 - Windows:'/'、'\'都行 - 类unix:'/' - 建议:统一使用'/' - 目录名词 - 相对目录:有参考的目录叫相对目录 - . 表示当前目录 - .. 表示上一级目录 - 绝对目录:没有参考的目录叫绝对目录 - windows:以盘符开头的目录 - 类unix:以'/'开头的目录 ### 练习: - 实现文件的拷贝功能,需要考虑大文件的操作。 - 删除一个目录,需要进行递归操作 - 拷贝一个目录 - 移动一个目录 - 整理目录 - 一个目录下有各种文件,也有文件夹 - 将所有的文件夹都放在DIRS中 - 将所有无后缀的文件都放在OTHERS中 - 将有后缀的文件放在后缀大写的目录下 - 示例: ``` 整理前: test/ dir1/ dir2/ dir3/ 1.txt 2.txt 3.py 4.py 123 456 整理后: test/ DIRS/ dir1/ dir2/ dir3/ TXT/ 1.txt 2.txt PY/ 3.py 4.py OTHERS/ 123 456 ```