009.File & OS
File
open() 方法
Python open() 方法用于打开一个文件,并返回文件对象。在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode='r')
mode 参数有:
r:读取(默认值)w:写入,并先截断文件x:排它性创建,如果文件已存在,则创建失败a:打开文件用于写入,如果文件存在,则在文件末尾追加内容b:二进制模式t:文本模式(默认值)+:打开用于更新(读取与写入)
默认为文本模式,如果要以二进制模式打开,加上 b 。
read 方法
- 概述:使用『文件对象』的
read方法,读取文件中的内容。 - 方法说明:
read(size)中的size是可选参数。- 若不传递
size参数,表示:读取文件中所有的内容(注意内存占用!)。 - 若传递了
size参数,表示:读取文件中指定个数的字符,或指定大小的字节。
- 若不传递
read会从上一次read的位置继续读取,若到达文件末尾后继续读取,将返回空字符串。
# 第一步:创建『文件对象』
# 完整写法
# file = open(file='a.txt', mode='rt', encoding='utf-8')
# 简写
file = open('a.txt', 'rt', encoding='utf-8')
# 读取二进制文件
# file = open('D:/test/girl.jpg', 'rb')
# 第二步:操作文件(读取)
# 多次调用read去逐步读取文件
r1 = file.read(2)
r2 = file.read(3)
r3 = file.read()
print(r1, end='')
print(r2, end='')
print(r3, end='')
# 用循环配合多次read(对内存友好)
while True:
result = file.read(10)
if result == '':
break
print(result, end='')
# 第三步:关闭文件
file.close()
readline 方法
- 概述:使用文件对象的
readline方法,读取文件中的一行。 - 方法说明:
readline(size)中的size是可选参数。- 若不传递
size参数,表示:读取当前这一行所有的内容。 - 若传递了
size参数,表示:表示读取当前行时,最多能读取的字符数,或字节数 - 注意:
size不是行数。
- 若不传递
readline方法,也是从上一次位置继续读取,若到达文件末尾后继续读取,返回空字符串。
# 第一步:创建『文件对象』
file = open('a.txt', 'rt', encoding='utf-8')
# 第二步:操作文件(读取)
# 依次调用readline逐行读取
r1 = file.readline()
r2 = file.readline()
print(r1.strip())
print(r2.strip())
# 通过循环配合readline逐行读取
while True:
line = file.readline()
if line == '':
break
# print(line.strip())
print(line, end='')
# 第三步:关闭文件
file.close()
for 循环遍历文件对象
- 概述:可以使用
for循环直接遍历文件对象(逐行遍历)。
# 第一步:创建『文件对象』
file = open('a.txt', 'rt', encoding='utf-8')
# 第二步:操作文件(读取)
for line in file:
print(line, end='')
# 第三步:关闭文件
file.close()
readlines 方法
- 概述:使用文件对象的
readlines方法,一次性按“行”读完,返回一个列表。 - 方法说明:
readlines(hint)中的hint是可选参数。- 若不传递
hint参数,表示:读取当前文件的所有行。 - 若传递了
hint参数,表示:期望读取的【字符个数 或 字节数】(hint不是行数)。
- 若不传递
- 注意:由于
readlines是一次性读取文件的所有内容,所以不适合读取体积较大的文件。
# 第一步:创建『文件对象』
file = open('a.txt', 'rt', encoding='utf-8')
# 第二步:操作文件(读取)
result = file.readlines()
print(result)
# 第三步:关闭文件
file.close()
最佳实践
- 概述:更推荐使用
with上下文管理器,结合for循环遍历,逐行读取文件。
with open('a.txt', 'rt', encoding='utf-8') as file:
for line in file:
print(line, end='')
file 对象
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
| 序号 | 方法及描述 |
|---|---|
| 1 | file.close()关闭文件。关闭后文件不能再进行读写操作。 |
| 2 | file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
| 3 | file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
| 4 | file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。 |
| 6 | file.read([size])从文件读取指定的字节数,如果未给定或为负则读取所有。 |
| 7 | file.readline([size])读取整行,包括 "\n" 字符。 |
| 8 | file.readlines([sizeint])读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
| 9 | file.seek(offset[, whence])移动文件读取指针到指定位置 |
| 10 | file.tell()返回文件当前位置。 |
| 11 | file.truncate([size])从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。 |
| 12 | file.write(str)将字符串写入文件,返回的是写入的字符长度。 |
| 13 | file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
flush 方法
- 概述:Python 写入文件时,并不是每写一次就立刻落盘,而是:先写到“缓冲区”里。
flush方法:把缓冲区中的数据,立刻写入到文件中。
import time
with open('demo.txt', 'at', encoding='utf-8') as file:
file.write('你好1')
file.flush()
time.sleep(10000)
file.write('你好2')
目录操作
Python 中常见的目录操作如下:
import os
import shutil
# 1️⃣os.mkdir(path):创建“单级”目录(如果目录已经存在,则会抛出异常)
os.mkdir('D:/demo')
# 2️⃣os.makedirs(path):创建“多级”目录(如果路径中的所有目录都已经存在,则会抛出异常)
os.makedirs('D:/demo/aa/bb')
# 3️⃣os.rmdir(path):删除空目录(如果目录不存在,或目录非空,都会抛出异常)
os.rmdir('D:/demo/aa/bb')
# 4️⃣os.removedirs(path):递归删除空目录,在成功删除末尾一级目录后,会“向上”尝试把父级目录也删除
# (直到父目录不是空目录)
os.removedirs('D:/demo/aa/bb')
# 5️⃣os.path.exists(path):判断路径是否存在(文件/目录都算)
result = os.path.exists('D:/demo/aa/bb')
print(result)
# 6️⃣os.path.isdir(path):用于判断路径,具体规则如下:
# 1.路径不存在 ==================> 返回 False
# 2.路径存在,但指向的是文件 =====> 返回 False
# 3.路径存在,并且是目录 =======> 返回 True
result = os.path.isdir('D:/demo/aa/bb')
print(result)
# 7️⃣os.path.isfile(path):判断是否为文件
result = os.path.isfile('D:/demo/aa/bb')
print(result)
# 8️⃣os.scandir(path):扫描指定目录
result = os.scandir('D:/demo')
for item in result:
print('目录' if item.is_dir() else '文件', item.name)
# 9️⃣os.walk(path):按层级,递归地遍历指定目录下,所有的子目录和文件
result = os.walk('D:/demo')
for item in result:
print(item)
# ⚠️危险操作:删除有内容的目录
shutil.rmtree('D:/demo')
OS 文件/目录
os 模块是 Python 标准库中的一个重要模块,它提供了与操作系统交互的功能。通过 os 模块,可以执行文件操作、目录操作、环境变量管理、进程管理等任务。
os 模块是跨平台的,这意味着可以在不同的操作系统(如 Windows、Linux、macOS)上使用相同的代码。
常用方法
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
| 序号 | 方法及描述 |
|---|---|
| 1 | os.access(path, mode)检验权限模式 |
| 2 | os.chdir(path)改变当前工作目录 |
| 3 | os.chflags(path, flags)设置路径的标记为数字标记。 |
| 4 | os.chmod(path, mode)更改权限 |
| 5 | os.chown(path, uid, gid)更改文件所有者 |
| 6 | os.chroot(path)改变当前进程的根目录 |
| 7 | os.close(fd)关闭文件描述符 fd |
| 8 | os.closerange(fd_low, fd_high)关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
| 9 | os.dup(fd)复制文件描述符 fd |
| 10 | os.dup2(fd, fd2)将一个文件描述符 fd 复制到另一个 fd2 |
| 11 | os.fchdir(fd)通过文件描述符改变当前工作目录 |
| 12 | os.fchmod(fd, mode)改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
| 13 | os.fchown(fd, uid, gid)修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
| 14 | os.fdatasync(fd)强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
| 15 | os.fdopen(fd[, mode[, bufsize]])通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
| 16 | os.fpathconf(fd, name)返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
| 17 | os.fstat(fd)返回文件描述符fd的状态,像stat()。 |
| 18 | os.fstatvfs(fd)返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs()。 |
| 19 | os.fsync(fd)强制将文件描述符为fd的文件写入硬盘。 |
| 20 | os.ftruncate(fd, length)裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
| 21 | os.getcwd()返回当前工作目录 |
| 22 | os.getcwdb()返回一个当前工作目录的Unicode对象 |
| 23 | os.isatty(fd)如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
| 24 | os.lchflags(path, flags)设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
| 25 | os.lchmod(path, mode)修改连接文件权限 |
| 26 | os.lchown(path, uid, gid)更改文件所有者,类似 chown,但是不追踪链接。 |
| 27 | os.link(src, dst)创建硬链接,名为参数 dst,指向参数 src |
| 28 | os.listdir(path)返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
| 29 | os.lseek(fd, pos, how)设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
| 30 | os.lstat(path)像stat(),但是没有软链接 |
| 31 | os.major(device)从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
| 32 | os.makedev(major, minor)以major和minor设备号组成一个原始设备号 |
| 33 | os.makedirs(path[, mode])递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
| 34 | os.minor(device)从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
| 35 | os.mkdir(path[, mode])以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
| 36 | os.mkfifo(path[, mode])创建命名管道,mode 为数字,默认为 0666 (八进制) |
| 37 | os.mknod(filename[, mode=0600, device]) 创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。 |
| 38 | os.open(file, flags[, mode])打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
| 39 | os.openpty()打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
| 40 | os.pathconf(path, name)返回相关文件的系统配置信息。 |
| 41 | os.pipe()创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
| 42 | os.popen(command[, mode[, bufsize]])从一个 command 打开一个管道 |
| 43 | os.read(fd, n)从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
| 44 | os.readlink(path)返回软链接所指向的文件 |
| 45 | os.remove(path)删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
| 46 | os.removedirs(path)递归删除目录。 |
| 47 | os.rename(src, dst)重命名文件或目录,从 src 到 dst |
| 48 | os.renames(old, new)递归地对目录进行更名,也可以对文件进行更名。 |
| 49 | os.rmdir(path)删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
| 50 | os.stat(path)获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
| 51 | os.stat_float_times([newvalue]) 决定stat_result是否以float对象显示时间戳 |
| 52 | os.statvfs(path)获取指定路径的文件系统统计信息 |
| 53 | os.symlink(src, dst)创建一个软链接 |
| 54 | os.tcgetpgrp(fd)返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
| 55 | os.tcsetpgrp(fd, pg)设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
| 59 | os.ttyname(fd)返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
| 60 | os.unlink(path)删除文件路径 |
| 61 | os.utime(path, times)返回指定的path文件的访问和修改的时间。 |
| 62 | os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
| 63 | os.write(fd, str)写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
| 64 | os.path 模块获取文件的属性信息。 |
| 65 | os.pardir()获取当前目录的父目录,以字符串形式显示目录名。 |
| 66 | os.replace()重命名文件或目录。 |
| 67 | os.startfile()用于在 Windows 上打开一个文件或文件夹。 |