【python文件处理】使用 open() 函数打开文件、 File 操作文件、使用 OS 对象操作文件目录的知识,使用 open() 函数打开文件
在计算机世界中,文本文件可存储各种各样的数据信息,例如天气预报、交通信息、财经数据、文学作品等。当需要分析或修改存储在文件中的信息时,读取文件工作十分重要。通过文件读取功能,不仅可以获取一个文本文件的内容,还可以重新设置里面的数据格式并将其写入到文件中,同时可以让浏览器显示文件中的内容✮ℬ𝓇𝓊𝓃𝒸𝒽 𝓉𝒾𝓂ℯ⋆˙🍇
一、使用 open() 函数打开文件‧₊˚✩彡
🔮在读取一个文件的内容之前,需要先打开这个文件。在 Python 程序中,可以通过内置函数 open() 来打开一个文件,并用相关的方法读或写文件中的内容以供程序处理和使用,同时可以将文件看作 Python 中的一种数据类型。使用函数 open() 的语法格式如下所示。
open(filename, mode='r', buffering=-l, encoding=None, errors=None, newline=None,closefd= True, opener=None)
🪻当使用上述函数 open() 打开一个文件后,就会返回一个文件对象。上述格式中主要参数的具体说明如下所示。
- filename:表示要打开的文件名。
- mode:可选参数,文件打开模式。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:可选参数,缓冲区大小。
- encoding:文件编码类型。
- errors:编码错误处理方法。
- newline:控制通用换行符模式的行为。
- closefd:控制在关闭文件时是否彻底关闭文件。
🪻在下述格式中,参数 “mode” 表示文件打开模式
二、使用 File 操作文件‧₊˚✩彡
🔮在 Python 程序中,当一个文件打开后,便可以使用 File 对象得到这个文件的各种信息。File 对象中的属性信息如表 所示
🪻在 Python 程序中,对象 File 是通过内置函数实现对文件的操作的,其中常用的内置函数如表所示
🫧下面的实例代码演示了打开一个文件并查看使用文件属性的过程
# 打开一个文件
fo = open("456.txt", "wb") #用wb格式打开指定文件
print ("文件名: ", fo.name) #显示文件名
print ("是否已关闭 : ", fo.closed)#显示文件是否关闭
print ("访问模式 : ", fo.mode)#显示文件的访问模式
🪻在上述代码中,使用函数 open() 以 “wb” 的方式打开了文件 “456.txt”。然后分别获取了这个文件的 name、closed 和 mode 属性信息。执行效果如图
三、使用 close() 方法关闭操作‧₊˚✩彡
🔮方法 close() 用于关闭一个已经打开的文件,关闭后的文件不能再进行读写操作,否则会触发 ValueError 错误。在程序中可以多次调用 close() 方法,当引用 file 对象操作另外一个文件时,Python 会自动关闭之前的 file 对象。使用 close() 方法的语法格式如下所示
fileObject.close();
🪻方法 close() 没有参数,也没有返回值。下面的实例代码演示了使用 close() 方法关闭文件的过程
fo = open("456.txt", "wb") #用wb格式打开指定文件
print("文件名为: ", fo.name) #显示打开的文件名
# 关闭文件
fo.close()
🫧在上述代码中,首先使用函数 open() 以 “wb” 的方式打开了文件 “456.txt”。然后使用 close() 方法关闭文件。执行效果如图
四、使用方法 flush()‧₊˚✩彡
🔮方法 flush() 的功能是刷新缓冲区,即将缓冲区中的数据立刻写入文件,同时清空缓冲区。在一般情况下,文件关闭后会自动刷新缓冲区,但是有时需要在关闭之前刷新它,这时就可以使用方法 flush() 实现。使用方法 flush() 的语法格式如下所示。
fileObject.flush();
🪻方法 flush() 没有参数,也没有返回值。下面的实例代码演示了使用 flush() 方法刷新缓冲区的过程
#用wb格式打开指定文件
fo = open("456.txt", "wb")
print ("文件名为: ", fo.name) #显示打开文件的文件名
fo.flush() #刷新缓冲区
fo.close() #关闭文件
🫧在上述代码中,首先使用函数 open() 以 “wb” 的方式打开文件 “456.txt”,然后使用方法 flush() 刷新缓冲区,最后使用方法 close() 关闭文件。执行后的效果如图 12-3 所示
五、使用方法 fileno()‧₊˚✩彡
🔮方法 fileno() 的功能是返回一个整型的文件描述符,它可以用于底层操作系统的 I/O 操作。使用方法 fileno() 的语法格式如下所示
fileObject.fileno();
🪻方法 fileno() 没有参数,有返回值,返回一个整型文件描述符。下面的实例代码演示了使用 fileno() 方法返回文件描述符的过程。
#用wb格式打开指定文件
fo = open("456.txt", "wb")
print ("文件名是:", fo.name) #显示打开文件的文件名
fid = fo.fileno() #返回一个整型的文件描述符
print ("文件456.txt的描述符是:", fid)
#显示这个文件的描述符
fo.close() #关闭文件
🫧在上述代码中,首先使用函数 open() 以 “wb” 的方式打开文件 “456.txt”,然后使用方法 fileno() 返回这个文件的整型描述符,最后使用方法 close() 关闭文件。执行后的效果如图所示
六、使用方法 isatty()‧₊˚✩彡
🔮方法 isatty() 的功能是检测某文件是否连接到一个终端设备。如果连接到一个终端设备,则返回 True;否则,返回 False。使用方法 isatty() 的语法格式如下所示。
#用wb格式打开指定文件
fo = open("456.txt", "wb")
print ("文件名是:", fo.name) #显示打开文件的文件名
ret = fo.isatty() #检测文件是否连接到一个终端设备
print ("返回值是:", ret) #显示连接检测结果
fo.close() # 关闭文件
🪻在上述代码中,首先使用函数 open() 以 “wb” 的方式打开文件“456.txt”,然后使用方法 isatty() 检测这个文件是否连接到一个终端设备,最后使用方法 close() 关闭文件。执行后的效果如图 所示
七、使用方法 read()‧₊˚✩彡
🔮想使用某个文本文件中的数据信息,首先需要将这个文件的内容读取到内存中,既可以一次性读取文件的全部内容,也可以按照每次一行的方式进行读取。其中方法 read() 的功能是从目标文件中读取指定的字节数。如果没有给定字节数或字节数为负值,则读取所有内容。使用方法 read() 的语法格式如下所示。
file.read([size]);
🪻参数 “size” 表示从文件中读取的字节数,返回值是从字符串中读取的字节。下面的实例代码演示了使用方法 read() 返回文件中 3 字节内容的过程。
#用r+格式打开指定文件
fo = open("456.txt", "r+")
print ("文件名为: ", fo.name)#显示打开文件的文件名
line = fo.read(3) #读取文件中前3字节的内容
print ("读取的字符串: %s" % (line))#显示读取的内容
fo.close() #关闭文件
🫐在上述代码中,首先使用函数 open() 以 “r+” 的方式打开文件 “456.txt”,然后使用方法 read() 读取目标文件中前 3 字节的内容,最后使用方法 close() 关闭文件。
八、readline() 方法‧₊˚✩彡
🔮除了使用 read() 方法读取某个文本文件中的数据信息,还可以使用 readline() 方法。方法 readline() 的功能是从目标文件中读取整行内容,包括 "\n" 字符。如果指定了一个非负的参数,则返回指定大小的字节数,包括 "\n" 字符。使用方法 readline() 的语法格式如下所示。
fileObject.readline(size);
🫧参数 “size” 表示从文件中读取的字节数,返回值是从字符串中读取的字节。如果没有指定参数 “size”,则依次读取各行的内容。下面的实例代码演示了使用方法 readline() 返回文件各行内容的过程。
#用r+格式打开指定文件
fo = open("456.txt", "r+")
print ("文件名为: ", fo.name)#显示打开文件的文件名
line = fo.readline()#读取文件中第1行的内容
print ("读取第1行 %s" % (line)) #显示文件中第1行的内容
line = fo.readline()#读取文件中第2行的内容
print ("读取第2行 %s" % (line)) #显示文件中第2行的内容
line = fo.readline()#读取文件中第3行的内容
print ("读取第3行 %s" % (line)) #显示文件中第3行的内容
line = fo.readline(3)#读取文件中第4行前3字节的内容
print ("读取的字符串为:%s" % (line)) #显示文件中
#第4行前3字节的内容fo.close() #关闭文件
🪻在上述代码中,首先使用函数 open() 以 “r+” 的方式打开文件 “456.txt”,然后 3 次调用方法 readline() 依次读取目标文件中前 3 行内容,在第 4 次调用方法 readline() 时读取文件中第 4 行前 3 字节的内容,最后使用方法 close() 关闭文件。执行后的效果如图 所示
九、OS模块‧₊˚✩彡
🫧对一些比较烦琐的文件和目录操作,可以使用 Python 提供的 OS 模块对象来实现。在 OS 模块中包含了很多操作文件和目录的函数,可以方便地实现文件重命名、添加/删除目录、复制目录/文件等操作。
🔮在 Python 语言中,OS 对象主要包含了如下内置函数,具体说明如下所示。
- os.access(path, mode):检验权限模式。
- os.chdir(path):改变当前的工作目录。
- os.chflags(path, flags):设置路径的标记为数字标记。
- os.chmod(path, mode):更改权限。
- os.chown(path, uid, gid):更改文件所有者。
- os.chroot(path):改变当前进程的根目录。
- os.close(fd):关闭文件描述符 fd。
- os.closerange(fd_low, fd_high):关闭所有文件的描述符,从 fd_low(包含)到 fd_high(不包含),错误会被忽略。
- os.dup(fd):复制文件描述符 fd。
- os.dup2(fd, fd2):将一个文件描述符 fd 复制到另一个 fd2。
- os.fchdir(fd):通过文件描述符改变当前工作目录。
- os.fchmod(fd, mode):改变一个文件的访问权限,该文件由参数 fd 指定,参数 mode 是 UNIX 系统下的文件访问权限。
- os.fchown(fd, uid, gid):修改一个文件的所有权,这个函数修改一个文件的用户 ID 和用户组 ID,该文件由文件描述符 fd 指定。
- os.fdatasync(fd):强制将文件写入磁盘,该文件由文件描述符 fd 指定,但是不强制更新文件的状态信息。
- os.fdopen(fd[, mode[, bufering]]):通过文件描述符 fd 创建一个文件对象,并返回这个文件对象。
- os.fpathconf(fd, name):返回一个打开的文件的系统配置信息。name 为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准(POSIX.1、UNIX 95、 UNIX 98 等)中指定。
- os.fstat(fd):返回文件描述符 fd 的状态,如 stat()。
- os.fstatvfs(fd):返回包含文件描述符 fd 的文件所在文件系统的信息,如 statvfs()。
- os.fsync(fd):强制将文件描述符为 fd 的文件写入硬盘中。
- os.ftruncate(fd, length):裁剪文件描述符 fd 对应的文件,所以它最大不能超过文件大小。
- os.getcwd():返回当前工作目录。
- os.isatty(fd):如果文件描述符 fd 是打开的,同时与 tty(-like) 设备相连,则返回 True;否则,返回 False。
- os.lchflags(path, flags):设置路径的标记为数字标记,类似于函数 chflags(),但是没有软链接。
- os.lchmod(path, mode):修改链接文件权限。
- os.lchown(path, uid, gid):更改文件所有者,类似于函数 chown(),但是不追踪链接。
- os.link(src, dst):创建硬链接,名为参数 dst,指向参数 src。
- os.listdir(path):返回 path 指定的文件夹包含的文件或文件夹的名字列表。
- os.lseek(fd, pos, how):设置文件偏移位置,文件由文件描述符 fd 指示。这个函数依据参数 how 来确定文件偏移的起始位置,参数 pos 指定位置的偏移量。
- os.lstat(path):类似于 stat(),但是没有软链接。
- os.major(device):从原始的设备号中提取设备 major 号码(使用 stat 中的 st_dev 或者 st_rdev field)。
- os.makedev(major, minor):以 major 和 minor 设备号组成一个原始设备号。
- os.makedirs(neme[, mode]):递归文件夹创建函数。和函数 mkdir() 类似,但创建的所有 intermediate-level 文件夹需要包含子文件夹。
- os.minor(device):从原始的设备号中提取设备 minor 号码(使用 stat 中的 st_dev 或者 st_rdev field)。
- os.mkdir(path[, mode]):以数字 mode 的模式创建一个名为 path 的文件夹,默认的 mode 是 0777(八进制)。
- os.mkfifo(path[, mode]):创建命名管道,mode 为数字,默认为 0666(八进制)。
- os.mknod(path[, mode=0o600, device]):创建一个名为 path 的文件系统节点。
- os.open(path, flags[, mode]):打开一个文件,并且设置需要的打开选项,参数 mode 是可选的。
- os.openpty():打开一个新的伪终端对。返回 pty 和 tty 的文件描述符。
- os.pathconf(path, name):返回相关文件的系统配置信息。
- os.pipe():创建一个管道,返回一对文件描述符(r, w),分别表示读和写。
- os.popen(cmd[, mode[, bufering]]):从一个 cmd 打开一个管道。
- os.read(fd, n):从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd 对应的文件已达到结尾,返回一个空字符串。
- os.readlink(path):返回软链接所指向的文件。
- os.remove(path):删除路径为 path 的文件。如果 path 是一个文件夹,将抛出 OSError 异常。查看下面的 os.rmdir() 了解如何删除目录。
- os.removedirs(name):递归删除目录。
- os.rename(src, dst):重命名文件或目录,从 src 到 dst。
- os.renames(old, new):递归地对目录进行更名,也可以对文件进行更名。
- os.rmdir(path):删除 path 指定的空目录,如果目录非空,则抛出一个 OSError 异常。
- os.stat(path):获取 path 指定的路径的信息,功能等同于 C API 中的 stat() 系统调用。
- os.stat_float_times([newvalue]):决定 stat_result 是否以 float 对象的格式显示时间戳。
- os.statvfs(path):获取指定路径的文件系统统计信息。
- os.symlink(src, dst):创建一个软链接。
- os.tcgetpgrp(fd):返回与终端 fd(一个由 os.open() 返回的打开的文件描述符)关联的进程组。
- os.tcsetpgrp(fd, pg):设置与终端 fd(一个由 os.open()返回的打开的文件描述符)关联的进程组为 pg。
- os.ttyname(fd):返回一个字符串,它表示与文件描述符 fd 关联的终端设备。如果 fd 没有与终端设备关联,则引发一个异常。
- os.unlink(path):删除文件路径。
- os.utime(path, times):返回指定的 path 文件访问和修改的时间。
- os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]):通过在树中游走、向上或者向下输出在文件夹中的文件名。
- os.write(fd, str):写入字符串到文件描述符 fd 中,返回实际写入的字符串长度。
十、使用方法 access()‧₊˚✩彡
🔮方法 access() 的功能是检验对当前文件的操作权限模式。方法 access() 使用当前的 uid/gid 尝试访问指定路径。使用方法 access() 的语法格式如下所示
os.access(path, mode);
🪻参数 “path” 用于检测路径是否有访问权限。参数 “mode” 表示测试当前路径的模式,主要包括如下 4 种取值模式。
- os.F_OK:测试 path 是否存在。
- os.R_OK:测试 path 是否可读。
- os.W_OK:测试 path 是否可写。
- os.X_OK:测试 path 是否可执行。
🫧方法 access() 有返回值。如果允许访问,则返回 True;否则,返回 False。下面的实例代码演示了使用方法 access() 获取文件操作权限的过程。
import os, sys
# 假定 123/456.txt 文件存在,并设置了读写权限
ret = os.access("123/456.txt", os.F_OK)
print ("F_OK - 返回值 %s"% ret)#显示文件是否存在
ret = os.access("123/456.txt", os.R_OK)
#测试文件是否可读
print ("R_OK - 返回值 %s"% ret) #显示文件是否可读
ret = os.access("123/456.txt", os.W_OK)
#测试文件是否可写
print ("W_OK - 返回值 %s"% ret) #显示文件是否可写
ret = os.access("123/456.txt", os.X_OK)
#测试文件是否可执行
print ("X_OK - 返回值 %s"% ret)#显示文件是否可执行
🫐在运行上述实例代码之前,首先需要在实例文件 quan.py
的同目录下创建一个名为 “123” 的文件夹,然后在里面创建一个文本文件 “456.txt”。在上述代码中,使用方法 access() 获取对文件 “123/456.txt” 的操作权限。执行后的效果如图所示
十一、创建目录‧₊˚✩彡
🔮在 Python 程序中,可以使用 OS 对象的内置方法创建文件夹目录。
🪻1.使用方法 mkdir()。
🫐在 Python 程序中,方法 mkdir() 的功能是以数字权限模式创建目录,默认的模式为 0777(八进制)。使用方法 mkdir() 的语法格式如下所示
os.mkdir(path[, mode])
🫧方法 mkdir() 有返回值,返回包含读取字节的字符串。上述格式中各个参数的具体说明如下所示。
- 参数 path:表示要创建的目录。
- 参数 mode:表示要为目录设置的数字权限模式。
🫐下面的实例代码演示了使用方法 mkdir() 创建一个目录的过程。
import os, sys
#变量path表示要创建的目录
path = "top"
os.mkdir( path ) #执行创建目录操作
print ("目录已创建")
🪻2.使用方法 makedirs()。
🫐在 Python 程序中,方法 makedirs() 的功能是递归创建目录。功能和方法 mkdir() 类似,但是可以创建包含子目录的文件夹目录。使用方法 makedirs() 的语法格式如下所示
os.makedirs(path, mode=0o777)
🫧方法 makedirs() 有返回值,它返回包含读取字节的字符串。上述格式中各个参数的具体说明如下所示。
- 参数 path:表示要递归创建的目录。
- 参数 mode:表示要为目录设置的数字权限模式。
import os, sys #变量path表示要创建的目录 path = "tmp/home/123" os.makedirs( path ); #执行创建操作 print ("路径被创建")
致谢
谢谢大家的阅读,很多不足支出,欢迎大家在评论区指出,如果我的内容对你有帮助,
可以点赞 , 收藏 ,大家的支持就是我坚持下去的动力!
请赐予我平静,去接受我无法改变的 :赐予我勇气,去改变我能改变的。