<代码前提>
本章所有代码示例都是以下面代码创造的环境为前提。
本章所有代码测试在单位做的,来自于 lightly 网页版的 IDE,属于Unix?运行结果可能与 Wind 不一样。
代码前提 |
|
python import os folder_name = 'test' if not os.path.exists(folder_name): os.mkdir(folder_name) for i in range(1, 5+1): f1 = open(f'test/a{i}.txt', 'w') f1.close() |
python # 加载 os 模块 # 根文件夹内创建一个名为‘text’的文件夹 # 判断文件夹是否存在 # test 文件夹中创建5个txt文件 |
1 Flie 对象
1.1 打开/创建文件(open)
所有的文件操作都基于 File 对象,所以处理文件的第一步永远是创建 File 对象。
打开文件并返回file对象给变量 |
|
|
|
|
|
|
|
python # 只读 打开f1记事本;报错f6记事本 f1 = open('test/a1.txt', 'r') f6 = open('test/a6.txt', 'r') # 报错 # 只写 打开f2记事本;创建f7记事本 f2 = open('test/a2.txt', 'w') f7 = open('test/a7.txt', 'w') # 新建 # 追加 打开f3记事本;创建f8记事本 f3 = open('test/a3.txt', 'a') f8 = open('test/a8.txt', 'a') # 新建 |
|
|
|
访问模式 |
只读 |
只写 |
读写 |
|
|
|
|
|
r [默认] |
w |
a |
|
|
|
|
二进制 |
rb [默认] |
wb |
ab |
|
|
|
|
|
r+ |
w+ |
a+ |
|
|
|
|
二进制 |
rb+ |
wb+ |
ab+ |
|
|
|
|
文件不存在 |
报错 |
新建文件 |
新建文件 |
|
|
|
|
写入方式 文件指针 |
开头 |
开头 |
结尾追加 |
+ 路径中有路径不存在则报错; |
|
|
|
|
|
|
|
open 参数很多,了解更多 |
|
|
|
|
|
|
|
[Python3 File 方法 |
菜鸟教程](https://www.runoob.com/python3/python3-file-methods.html) |
|
|
|
|
|
|
1.2 关闭文件(close)
文件关闭 |
|
|
|
|
|
|
|
python f = open('test/a0.txt', 'w') f.close |
|
|
|
python # 打开test下的a0.txt文件 # a0.txt 不存在,故新建一个a0.txt文件 # 关闭该文件 |
1.3 写入文件(write)
写入文件信息 |
|
python # 只读方式打开的文件 不能写入数据 f1 = open('test/a1.txt', 'r') f1.write('啊对对对~') # 只写方式打开的文件 写入数据 for i in range(2): f2 = open('test/a2.txt', 'w') f2.write('啊对对对~') f2.close # 追加方式打开的文件 写入数据 for i in range(2): f3 = open('test/a3.txt', 'a') f3.write('啊对对对~') f3.close |
python # 写入则报错 报错 # 每次写入信息,都会先清空内容再写入 a2.txt: 啊对对对~ # 每次写入信息,都会在结尾追加写入 a3.txt: 啊对对对~啊对对对~ |
1.4 读取文件(read)
准备代码 — 测试前需输入 |
|
python # 准备实例环境 def prepare_poem(): f1 = open('test/a1.txt', 'w+') f1.write('''《无题》 初三班主任题 秋夜静 何处对残灯 啼笑非谁谁识我 坐行梦梦尽缘君 何所谓消沉 风卷雨 雨复卷侬心 心似欲随风雨去 茫茫大海任浮沉 无爱亦无憎''') |
python |
返字符串 — .read() .readline() |
|
python # 读所有 f1 = open('test/a1.txt', 'r') str1 = f1.read() print(str1) # 读指定长度字符 f1 = open('test/a1.txt', 'r') str2 = f1.read(3) print(str2) f1 = open('test/a1.txt', 'r') str2 = f1.readline(3) print(str2) # 读整行 f1 = open('test/a1.txt', 'r') str2 = f1.readline() print(str2) f1 = open('test/a1.txt', 'r') str2 = f1.readline(10) print(str2) |
python # 返回整首诗 # 返回:《无题 # readline()参数指针没到行末 # 返回:《无题 # 返回:《无题》 # readline()参数指针超过行末 # 返回:《无题》 |
返列表 — .readlines() |
|
python # 读所有 f1 = open('test/a1.txt', 'r') lis = f1.readlines() print(lis) print(len(lis)) # 按指针指引 部分读取 f1 = open('test/a1.txt', 'r') lis = f1.readlines(10) print(lis) print(len(lis)) |
python # 返回列表:一个元素为一行诗 # 返回:12 # readlines()参数指针扫过几行,返几行 # 返回:含2元素的列表 # 返回:2 |
1.5 文件指针(tell/seek)
返回文件指针位置 — .find() .seek() |
|
python # 准备实例环境 f4 = open('test/a4.txt', 'w') f4.write('''abcdefg hijklmn opq rst uvwxyz''') # 直接 返回当前指针位置 print(f4.tell()) # 移动 并返回指针位置 print(f4.seek(0)) f4.close() |
python # 读、写都会移动指针 30 0 |
移动(需执行过上面代码) |
|
python f4 = open('test/a4.txt', 'r') # 移动到起点 f4.seek(0) # 等同于:f4.seek(0, 0) print(f4.tell()) # 0 # 移动到终点 f4.seek(0, 2) print(f4.tell()) # 30 # 移动到起点 后3个字符处 f4.seek(3, 0) print(f4.tell()) # 3 # 移动到起点 前3个字符处 f4.seek(-3, 2) print(f4.tell()) # 报错 # 移动到 前3个字符处 f4.seek(-3, 1) print(f4.tell()) # 报错 # 报错信息为:io.UnsupportedOperation |
python f4 = open('test/a4.txt', 'rb') # 移动到起点 f4.seek(0) # 等同于:f4.seek(0, 0) print(f4.tell()) # 0 # 移动到终点 f4.seek(0, 2) print(f4.tell()) # 30 # 移动到起点 后3个字符处 f4.seek(3, 0) print(f4.tell()) # 3 # 移动到起点 前3个字符处 f4.seek(-3, 2) print(f4.tell()) # 27 # 移动到 前3个字符处 f4.seek(-3, 1) print(f4.tell()) # 24 |
二进制模式 读取信息 |
|
python # 准备实例环境 f4 = open('test/a4.txt', 'rb') # 二进制模式下,读取信息为 b'xxxx' 格式,且保留 \n f4.seek(-3, 2) print(f4.readline()) # 返回:b'rst\n' # 进一步进行数据处理 f4.seek(-3, 2) print(str(f4.readline()).split("'")[1].split("\n")[0]) # 返回:xyz |
1.6 刷新缓存区(flush/close)
关闭时自动刷新缓存区 — .close() |
|
python # .close() 会自动刷新缓存区 import time f5 = open('test/a4.txt', 'w+') f5.write('999') time.sleep(5) f5.close() time.sleep(5) |
python # 此时 a4.txt 没有内容 # 关闭 a4.txt # 此时 a4.txt 有内容了 999 |
手动刷新缓存区 — .flush() |
|
python # .flush() 会自动刷新缓存区 import time f5 = open('test/a4.txt', 'w+') time.sleep(5) f5.write('666') f5.flush() time.sleep(5) |
python # 此时 a4.txt 没有内容 # 手动刷新 # 此时 a4.txt 有内容了 666 |
1.7 返回文件信息(属性)
返回文件信息(属性) |
|
python f4 = open('test/a4.txt', 'w+') # 检测文件是否关闭状态 print(f4.closed) # 返回file对象的模式 print(f4.mode) # 返回file对象的路径 print(f4.name) f4.close() # 检测文件是否关闭状态 print(f4.closed) |
python False w+ test/a4.txt True |
1.8 盲区扩展
没明白怎么用 |
isatty()方法 |
用于检查文件流在Python中是否是交互式的 |
|
fileno()方法 |
返回一个整数,这个整数就是文件的文件描述字 |
|
truncate()方法 |
截断文件 |
用不了 |
.encoding 属性 |
只读属性,文件的encoding格式 |
|
.newlines 属性 |
|
|
.softspace 属性 |
只读的布尔属性,供print语句记录自己的状态,file对象自身并不修改或使用该属性。 |
|
.errors 属性 |
|
(原创)Python文件与文件系统系列(1)—— file 对象 - 王智愚 - 博客园 |
|
2 文件处理(os)
os 也可以操作 txt 文件,但是用起来没有 File 对象好用。想了解可详见 4。
2.1 文件操作权限判断(access)
判断文件的操作权限 — .access() |
|
```python import os f1 = open(‘test/a1.txt’, ‘w’) # 判断文件是否存在 print(os.access(f1.name, os.F_OK)) # 判断文件是否可读 print(os.access(f1.name, os.R_OK)) # 判断文件是否可写 print(os.access(f1.name, os.W_OK)) # 判断文件是否可执行 print(os.access(f1.name, os.X_OK)) # 多条件同时判断 print(os.access(f1.name, os.F_OK |
\ os.R_OK |
os.W_OK |
os.X_OK)) ``` |
python True True True False False |
2.2 文件删除(remove/unlink)
删除文件 — .remove() |
|
python import os file_name = 'test/b1.txt' f1 = open(file_name, 'w') f1.close() print(os.access(file_name, os.F_OK)) os.remove(file_name) print(os.access(file_name, os.F_OK)) |
python # 创建文件,并打开 # 关闭 True # 文件还存在 # 删除文件 False # 文件不存在了 |
删除文件 — .unlink() |
|
python import os file_name = 'test/b1.txt' f1 = open(file_name, 'w') f1.close() print(os.access(file_name, os.F_OK)) os.unlink(file_name) print(os.access(file_name, os.F_OK)) |
python # 创建文件,并打开 # 关闭 True # 文件还存在 # 删除文件 False # 文件不存在了 |
2.3 文件重命名(rename)
文件重命名 — .rename() |
|
python import os f1 = open('test/b1.txt', 'w') f1.close() os.rename('test/b1.txt', 'test/c1.txt') print(os.access('test/b1.txt', os.F_OK)) print(os.access('test/c1.txt', os.F_OK)) |
python # 创建文件,并打开 # 关闭 # 文件重命名 False # 原文件没了 True # 新文件有了 |
3 目录处理(os)
3.1 目录创建(mkdir)
文件夹不存在则创建文件夹 — .mkdir() |
|
python import os def folder_create(folder_name): if not os.path.exists(folder_name): # 创建文件夹 os.mkdir(folder_name) folder_create('test') |
python # 该目录已存在则报错 # 仅创建最后一级目录,上级目录不存在则报错 |
3.2 目录删除(rmdir)
删除文件夹 — .rmdir() |
|
python import os folder_create('test') folder_create('test/test') print(os.path.exists('test/test')) os.rmdir('test/test') print(os.path.exists('test/test')) |
python # 自定义函数-创建文件夹 test # 自定义函数-创建文件夹 test/test True # 删除文件夹 False |
+ 目录不存在。报错:FileNotFoundError + 目录不是末级目录。报错:OSError |
3.3 目录重命名(rename)
目录重命名 — .rename() |
|
python import os folder_create('test') folder_create('test/test') os.rename('test/test', 'test/TEST') print(os.path.exists('test/test')) print(os.path.exists('test/TEST')) |
python # 自定义函数-创建文件夹 test # 自定义函数-创建文件夹 test/test # 文件夹重命名 False # 原文件夹被删掉了 True # 新文件夹存在 |
3.4 获取文件列表
3.4.1 返回路径单层(listdir)
返回路径单层 — listdir |
|
python import os os.chdir(os.getcwd() + '/test') print(os.listdir()) |
python ['a7.txt', 'a3.txt', 'a8.txt', 'a2.txt', 'c1.txt', 'a1.txt', 'TEST', 'a4.txt', 'a5.txt'] # 其返回结果是乱序的 |
3.4.2 返回路径下各层(walk)
返回路径下各层 — walk |
|
python import os # 遍历目录 for root, dirs, files in os.walk(r'.\test'): print('路径:',root) print('路径下目录名:',end='') for name in dirs: print(name,end='') print() print('路径下文件名:',end='') for name in files: print(name,end='') print() print('-'*30) |
python 路径: .\test 路径下目录名:abc 路径下文件名: ------------------------------ 路径: .\test\a 路径下目录名: 路径下文件名:a1.txta2.txt ------------------------------ 路径: .\test\b 路径下目录名:bb 路径下文件名: ------------------------------ 路径: .\test\b\bb 路径下目录名: 路径下文件名:bb1.txt ------------------------------ 路径: .\test\c 路径下目录名: 路径下文件名: ------------------------------ |
4 未学习(dlc)
Python3 OS 文件/目录方法 | 菜鸟教程
4.1 打开其他程序(ShellExecute)