目录
1. Python文件操作函数介绍
读写文件是最常见的IO操作,Python内置了读写文件的函数,用法和C是兼容的。
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
Python 提供了非常丰富的文件 I/O 支持,它既提供了 pathlib 和 os.path 来操作各种路径,也提供了全局的 open() 函数来打开文件(在打开文件之后,程序既可读取文件的内容,也可向文件输出内容)。而且 Python 提供了多种方式来读取文件内容,因此非常简单、灵活。
此外,在 Python 的 os 模块下也包含了大量进行文件 I/O 的函数,使用这些函数来读取、写入文件也很方便,因此可以根据需要选择不同的方式来读写文件。
Pyhon 还提供了 tempfile 模块来创建临时文件和临时目录,tempfile 模块下的高级 API 会自动管理临时文件的创建和删除;当程序不再使用临时文件和临时目录时,程序会自动删除临时文件和临时目录。
2. 操作文件的一般顺序
Python 中,对文件的操作有很多种,常见的操作包括创建、删除、修改权限、读取、写入等。
对文件的编程操作可以分为以下 3 步,每一步都需要借助对应的函数实现:
(1)、打开文件:使用 open() 函数,该函数会返回一个文件对象;
(2)、对已打开文件做读/写操作:读取文件内容可使用 read()、readline() 以及 readlines() 函数;向文件中写入内容,可以使用 write() 函数。
(3)、关闭文件:完成对文件的读/写操作之后,最后需要关闭文件,可以使用 close() 函数。
一个文件,必须在打开之后才能对其进行操作,并且在操作结束之后,还应该将其关闭,这 3 步的顺序不能打乱。
在Python 中,可以利用os.getcwd()函数可以取得当前的工作路径:
#!/usr/bin/python3 import os print ("当前的工作路径: ", os.getcwd()) |
结果:
当前的工作路径: C:\Users\weiguopai\Desktop\test |
在操作文件时,如果没有填文件的路径,那么文件的默认路径就在用户目录路径下。
3. Python内置的open函数
3.1 open函数功能与语法介绍
在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。
Python open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 函数一定要保证关闭文件对象,即调用 close() 函数。
open()函数常用形式是接收两个参数:文件名(file)和模式(mode)。
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) |
参数说明:
file: 必需,文件路径(相对或者绝对路径)。 mode: 可选,文件打开模式 buffering: 设置缓冲 encoding: 一般使用utf8 errors: 报错级别 newline: 区分换行符 closefd: 传入的file参数类型 |
示例:
file = open('wbyq.py','w',True,'utf8')
以写模式打开wbyq.py文件,设置open支持读写缓冲区,采用utf8编码。
3.2 open支持的文件打开模式
模式 | 说明 | 注意事项 |
r | 只读模式打开文件,读文件内容的指针会放在文件的开头。 | 操作的文件必须存在。 |
rb | 以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件(音频流)等。 | |
r+ | 打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。 | |
rb+ | 以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。 | |
w | 以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb | 以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件) | |
w+ | 打开文件后,会对原有内容进行清空,并对该文件有读写权限。 | |
wb+ | 以二进制格式、读写模式打开文件,一般用于非文本文件 | |
a | 以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。 | |
ab | 以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
a+ | 以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
ab+ | 以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 |
示例:
file = open('wbyq.py',mode='w') |
3.3 open的缓冲区
在使用 open() 函数时,如果其第三个参数是 0(或 False),那么该函数打开的文件就是不带缓冲的;如果其第三个参数是 1(或 True),则该函数打开的文件就是带缓冲的,此时程序执行 I/O 将具有更好的性能。如果其第三个参数是大于 1 的整数,则该整数用于指定缓冲区的大小(单位是字节);如果其第三个参数为任何负数,则代表使用默认的缓冲区大小。
众所周知,计算机外设(比如硬盘、网络)的 I/O 速度远远低于访问内存的速度,而程序执行 I/O 时要么将内存中的数据写入外设,要么将外设中的数据读取到内存,如果不使用缓冲,就必须等外设输入或输出一个字节后,内存中的程序才能输出或输入一个字节,这意味着内存中的程序大部分时间都处于等待状态。
内存中程序的读写速度很快,如果不使用缓冲,则程序必须等待外设进行同步读写。打个形象的比喻,就像在一条堵车的马路上开着跑车,必须等前面的车开一点,跑车才能前进一点。
因此,一般建议打开缓冲。在打开缓冲之后,当程序执行输出时,程序会先将数据输出到缓冲区中,而不用等待外设同步输出,当程序把所有数据都输出到缓冲区中之后,程序就可以去干其他事情了,留着缓冲区慢慢同步到外设即可;反过来,当程序执行输入时,程序会先等外设将数据读入缓冲区中,而不用等待外设同步输入。
3.4 open()文件对象常用的属性
成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:
file.closed:判断文件是否己经关闭。 file.mode:返回被打开文件的访问模式。 file.name:返回文件的名称。 |
示例代码:
#!/usr/bin/python3 #设置打开文件属性 file = open('123.txt','w',True,'utf8') print("当前访问文件的编码方式:", file.encoding) print("文件的访问模式:", file.mode) print("查看访问文件是否已经关闭:", file.closed) #False没有关闭、True已经关闭 print("访问文件对象打开的文件名:", file.name) |
结果:
当前访问文件的编码方式: utf8 文件的访问模式: w 查看访问文件是否已经关闭: False 访问文件对象打开的文件名: 123.txt |
4. 操作文件常用的方法
4.1 close()函数
close() 函数用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误,close()函数允许调用多次。
当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象, 使用 close() 方法关闭文件是一个好的习惯。
close() 方法语法:fileObject.close(); 示例代码:
#!/usr/bin/python3 #设置打开文件属性 file = open('123.txt','w',True,'utf8') print("当前访问文件的编码方式:", file.encoding) print("文件的访问模式:", file.mode) print("查看访问文件是否已经关闭:", file.closed) #False没有关闭、True已经关闭 print("访问文件对象打开的文件名:", file.name) file.close() |
4.2 flush()函数
flush()函数是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时需要在关闭前刷新它,这时就可以使用 flush() 方法。
flush() 方法语法:fileObject.flush(); 示例代码:
#!/usr/bin/python3 #设置打开文件属性 file = open('123.txt','w',True,'utf8') print("当前访问文件的编码方式:", file.encoding) print("文件的访问模式:", file.mode) print("查看访问文件是否已经关闭:", file.closed) #False没有关闭、True已经关闭 print("访问文件对象打开的文件名:", file.name) file.close() file.flush() |
4.3 fileno()函数
fileno()函数返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。fileno() 方法语法:fileObject.fileno();
#!/usr/bin/python3 #设置打开文件属性 file = open('123.txt','w',True,'utf8') fd = file.fileno() print ("文件描述符为: ", fd) #关闭文件file.close() |
结果:文件描述符为: 3
4.4 isatty()函数
isatty() 函数用于检查设备类型,判断文件是否是为终端机。如果是返回 True,否则返回 False。
4.5 read()函数
read()函数用于从文件读取指定的字节数,如果未给定或为负则读取所有。
read() 方法语法:fileObject.read();
示例代码:读取全部内容
#!/usr/bin/python3 file = open('123.txt','r') print("读取全部的内容:", file.read()) #关闭文件file.close() |
示例代码:读取指定字节数
#!/usr/bin/python3 file = open('123.txt','r') print("读取4个字节内容:",file.read(3)) #关闭文件 file.close() |
4.6 readline()函数
readline()函数用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。
readline() 方法语法:fileObject.readline(size); 其中size指定读取的字节数,只是限定一行。示例代码:
#!/usr/bin/python3 file = open('123.txt','r') print("读取4个字节内容:",file.readline()) #关闭文件 file.close() |
这是文件内容:第一行的尾部有换行符
123467
eeeeeeee
结果输出如下:
读取4个字节内容: 123467 |
4.7 readlines()函数
readlines()函数用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。如果碰到结束符 EOF 则返回空字符串。readlines()函数语法:fileObject.readlines();
示例代码:
#!/usr/bin/python3 file = open('123.txt','r') print("读取全部内容:", file.readlines()) #关闭文件file.close() |
输出:
读取全部内容: ['123467\n', 'eeeeeeee'] |
4.8 seek()函数
seek()函数用于移动文件指针到指定位置,如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
seek()函数语法:fileObject.seek(offset[, whence])
参数解析:
Offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。示例代码:
#!/usr/bin/python3 file = open('123.txt', 'r') file.seek(2) #从文件头向后偏移2个字节 print("读取的内容:", file.read()) #关闭文件 file.close() |
结果:读取的内容: 3467
eeeeeeee
4.9 tell()函数
tell()函数用于返回文件当前位置距离文件头的偏移量。示例代码:
#!/usr/bin/python3 file = open('123.txt', 'r') file.seek(4) print("当前位置距离文件头的字节数:", file.tell()) file.seek(2) print("当前位置距离文件头的字节数:", file.tell()) |
结果:当前位置距离文件头的字节数: 4
当前位置距离文件头的字节数: 2
4.10 truncate()函数
truncate()函数用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 ,后面的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小。
truncate()语法:fileObject.truncate( [ size ])
参数:size 可选,如果存在则文件截断为 size 字节。
123.txt文件中的内容:
123 456 789 |
示例代码:
#!/usr/bin/python3 file = open('123.txt','r+') file.truncate(3) #截取前面3个字节,后面的内容全部删除掉 print("文件的全部内容:", file.read()) #关闭文件file.close() |
结果:文件的全部内容: 123
4.11 write()函数
write()函数用于向文件中写入指定字符串。
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时在文件中是看不到写入的内容的。
如果文件打开模式带 b(二进制方式打开),那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not 'str'。
write() 函数语法:fileObject.write( [ str ])
参数:str 表示要写入文件的字符串。
示例代码:写入字符串数据
#!/usr/bin/python3 #使用写模式打开 file = open('python.txt','w') #写入字符串数据 file.write("欢迎学习Python") #关闭文件 file.close() #使用读模式打开 file = open('python.txt','r') print("文件中的内容:", file.read()) #关闭文件file.close() |
结果:文件中的内容: 欢迎学习Python
示例代码:以二进制方式读取文件
#!/usr/bin/python3 #使用写模式打开 file = open('python.txt','w',encoding='utf8') #写入字符串数据 file.write("欢迎学习Python") #关闭文件 file.close() #使用读模式打开 file = open('python.txt','rb') print("文件中的内容:", file.read()) #关闭文件 file.close() |
结果:文件中的内容: b'\xe6\xac\xa2\xe8\xbf\x8e\xe5\xad\xa6\xe4\xb9\xa0Python'
示例:写二进制字节
#!/usr/bin/python3 data=12345 #使用写模式打开 file = open('123.txt', 'wb') #写入字符串数据 file.write(data.to_bytes(4,'big')) #关闭文件 file.close() |
4.12 writelines()函数
writelines() 函数用于向文件中写入一序列的字符串。
这一序列字符串可以是由迭代对象产生的,如一个字符串列表,换行需要制定换行符 \n。
writelines()函数语法:fileObject.writelines( [ str ])
参数:str表示是要写入文件的字符串序列
示例代码:
#!/usr/bin/python3 #使用写模式打开 file = open('123.txt','w') #写入字符串数据 list=["1","2\n","3","4"] file.writelines(list) #关闭文件 file.close() #使用读模式打开 file = open('123.txt','r') print("文件中的内容:", file.read()) #关闭文件 file.close() |
结果:文件中的内容: 12
34
4.13 得到文件名称的后缀
思路:遍历文件名,找到”.”
示例代码:
#!/usr/bin/python3 def getfile_fix(filename): return filename[filename.rfind('.')+1:] print(getfile_fix('wbyq.txt')) |
5. 调用操作系统提供的接口函数操作文件
在系统命令终端下,如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如: mkdir、cp等命令。
如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。
查看当前操作系统类型:
#!/usr/bin/python3 import os #导入os模块 print("操作系统类型:", os.name) |
结果:操作系统类型: nt
如果是posix,说明系统是Linux、Unix或Mac OS X。如果是nt,就是Windows系统。
获取系统详细信息代码:
#!/usr/bin/python3 import os print(os.uname()) |
linux下输出结果:
posix.uname_result(sysname='Linux', nodename='wbyq', release='5.0.0-36-generic', version='#39~18.04.1-Ubuntu SMP Tue Nov 12 11:09:50 UTC 2019', machine='x86_64')
该函数在windows系统下不提供。
5.1 获取当前的工作路径
利用 os.getcwd() 函数可以取得当前工作路径的字符串。
#!/usr/bin/python3 import os print(os.getcwd()) #linux/windows都支持 |
5.2 切换工作目录
可以利用 os.chdir() 改变工作目录。
#!/usr/bin/python3 import os print("当前工作路径:", os.getcwd()) os.chdir("D:/linux-share-dir/Python") #windows下的路径 #os.chdir("/home/wbyq/work") #linux下的路径 print("当前工作路径:", os.getcwd()) |
5.3 处理绝对路径和相对路径方法
Python os.path 模块提供了一些函数,可以实现绝对路径和相对路径之间的转换,以及检查给定的路径是否为绝对路径。
(1)、调用 os.path.abspath(path) 返回 path 参数的绝对路径的字符串,这是将相对路径转换为绝对路径的简便方法。
#!/usr/bin/python3 import os file=open("123.py","w") file.write("hello python") file.close() print("绝对路径:", os.path.abspath("123.py")) #获取当前目录下的文件的绝对路径 |
(2)、调用 os.path.isabs(path),如果参数是一个绝对路径,就返回 True,如果参数是一个相对路径,就返回 False。
#!/usr/bin/python3 import os print(os.path.isabs("123.py")) #这是相对路径,返回False print(os.path.isabs("C:/Users/Desktop/test/123.py")) #这是绝对路径,返回True |
(3)、调用 os.path.relpath(path, start) 将返回从 start 路径到 path 的相对路径的字符串。如果没有提供 start,就使用当前工作目录作为开始路径。
(4)、调用 os.path.dirname(path) 将返回一个字符串,它包含 path 参数中最后一个斜杠之前的所有内容;调用 os.path.basename(path) 将返回一个字符串,它包含 path 参数中最后一个斜杠之后的所有内容。
#!/usr/bin/python3 import os print(os.path.dirname("C:/Users/Desktop/test/123.txt")) print(os.path.basename("C:/Users/Desktop/test/123.txt")) |
结果:C:/Users/weiguopai/Desktop/test
123.txt
(5)、如果同时需要一个路径的目录名称和基本名称,就可以调用 os.path.split() 获得这两个字符串的元组
#!/usr/bin/python3 import os print(os.path.split("C:/Users/weiguopai/Desktop/test/123.txt")) |
结果:('C:/Users/weiguopai/Desktop/test', '123.txt')
5.4 获取全部的环境变量
在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看:
#!/usr/bin/python3 import os print(os.environ) |
以字典的形式输出。
要获取某个环境变量的值,可以调用os.environ.get('key'):
#!/usr/bin/python3 import os print(os.environ.get('ZEPHYR_TOOLS')) |
结果:C:\xxxxx\ZEPHYR_SDK\1.04
5.5 创建目录、删除目录
示例代码:
#!/usr/bin/python3 import os #创建目录,如果目录已经存在就会报错 os.mkdir("D:/linux-share-dir/Python/test_dir") #创建目录,如果目录已经存在就会报错 os.mkdir("D:/linux-share-dir/Python/test_dir/6666") #删除目录,只能删除空目录 os.rmdir("D:/linux-share-dir/Python/test_dir/666") |
5.6 文件重命名
示例代码:
#!/usr/bin/python3 import os #打印文件绝对路径 print(os.path.abspath('123.txt')) #对文件重新命名 os.rename('123.txt','456.txt') #打印文件绝对路径 print(os.path.abspath('456.txt')) |
5.7 得到目录下的所有文件
得到当前目录下的所有文件或者目录,可以使用os.listdir(pwd)函数获取。
6. os.path模块常见函数用法
os.path 模块下提供了一些操作目录的方法,这些函数可以操作系统的目录本身。
例如,该模块提供了 exists() 函数判断该目录是否存在,也提供了 getctime()、getmtime()、getatime() 函数来获取该目录的创建时间、最后一次修改时间、最后一次访问时间,还提供了 getsize() 函数来获取指定文件的大小。
示例代码:
#!/usr/bin/python3 import os import time #创建文件 file=open("123.py", "w") file.close() # 获取绝对路径:C:\Users\11266\123.py print(os.path.abspath("123.py")) # 获取共同前缀:D:/linux-share-dir/P print(os.path.commonprefix(["D:/linux-share-dir/Python", 'D:/linux-share-dir/PHP'])) # 获取共同路径:D:\linux-share-dir print(os.path.commonpath(['D:/linux-share-dir/Python', 'D:/linux-share-dir/PHP'])) # 获取目录名称:D:/linux-share-dir print(os.path.dirname('D:/linux-share-dir/Python')) # 判断指定目录文件是否存在:False print(os.path.exists('D:/linux-share-dir/Python/JAVA')) # False # 获取最近一次访问时间:Wed Dec 11 15:23:37 2019 print(time.ctime(os.path.getatime('123.py'))) # 获取最后一次修改时间:Wed Dec 11 15:23:37 2019 print(time.ctime(os.path.getmtime('123.py'))) # 获取创建时间:Wed Dec 11 15:20:26 2019 print(time.ctime(os.path.getctime('123.py'))) # 获取文件大小:0 print(os.path.getsize('123.py')) # 判断是否为文件:True print(os.path.isfile('123.py')) # 判断是否为目录:False print(os.path.isdir('123.py')) # 判断是否为同一个文件:True print(os.path.samefile('123.py','123.py')) |
7. fnmatch模块:用于文件名的匹配
fnmatch 匹配支持的通配符:
*:可匹配任意个任意字符。 ?:可匹配一个任意字符。 |
[字符序列]:可匹配中括号里字符序列中的任意字符。该字符序列也支持中画线表示法。比如[a-c]可代表a、b 和 c 字符中任意一个。
[!字符序列]:可匹配不在中括号里字符序列中的任意字符。
7.1 fnmatch函数
fnmatch.fnmatch(filename, pattern)函数,用于判断指定文件名是否匹配指定pattern。
示例代码:
#!/usr/bin/python3 from pathlib import * import fnmatch # 遍历当前目录下所有文件和子目录 for file in Path('.').iterdir(): # 访问所有以.py结尾的文件,该函数不区分大小写 if fnmatch.fnmatch(file, '*.PY'): print(file) |
结果:123.py
python_code.py
7.2 filter函数
fnmatch.filter(names, pattern):该函数对 names 列表进行过滤,返回 names 列表中匹配 pattern 的文件名组成的子集合。
#!/usr/bin/python3 from pathlib import * import fnmatch names = ['a.py', 'b.py', 'c.py', 'd.py'] # 对names列表进行过滤 sub = fnmatch.filter(names, '[acd].py') print(sub) # ['a.py', 'c.py','d.py'] |
7.3 translate函数
fnmatch.translate(pattern):该函数用于将一个 UNIX shell 风格的 pattern 转换为正则表达式 pattern。
8. tempfile模块: 生成临时文件和临时目录
tempfile 模块专门用于创建临时文件和临时目录,它可以在 UNIX 平台上运行,也可以在 Windows 平台上运行。tempfile 模块中常用的函数:
tempfile 模块函数 | 功能描述 |
tempfile.TemporaryFile (mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None) | 创建临时文件。该函数返回一个类文件对象,也就是支持文件 I/O。 |
tempfile.NamedTemporaryFile (mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True) | 创建临时文件。该函数的功能与上一个函数的功能大致相同,只是它生成的临时文件在文件系统中有文件名。 |
tempfile.SpooledTemporaryFile (max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None) | 创建临时文件。与 TemporaryFile 函数相比,当程序向该临时文件输出数据时,会先输出到内存中,直到超过 max_size 才会真正输出到物理磁盘中。 |
tempfile.TemporaryDirectory (suffix=None, prefix=None, dir=None) | 生成临时目录。 |
tempfile.gettempdir() | 获取系统的临时目录。 |
tempfile.gettempdirb() | 与 gettempdir() 相同,只是该函数返回字节串。 |
tempfile.gettempprefix() | 返回用于生成临时文件的前缀名。 |
tempfile.gettempprefixb() | 与 gettempprefix() 相同,只是该函数返回字节串。 |
提示:表中有些函数包含很多参数,但这些参数都具有自己的默认值,因此如果没有特殊要求,可以不对其传参。
tempfile模块还提供了 tempfile.mkstemp() 和 tempfile.mkdtemp() 两个低级别的函数。
上面介绍的 4 个用于创建临时文件和临时目录的函数都是高级别的函数,高级别的函数支持自动清理,而且可以与 with 语句一起使用,而这两个低级别的函数则不支持,因此一般推荐使用高级别的函数来创建临时文件和临时目录。
此外,tempfile 模块还提供了 tempfile.tempdir 属性,通过对该属性赋值可以改变系统的临时目录。
示例代码:
#!/usr/bin/python3 import tempfile # 创建临时文件 fp = tempfile.TemporaryFile() print("创建的临时文件名称:",fp.name) # 向文件写入内容 fp.write('欢迎学习Python编程,'.encode('utf-8')) # 将文件指针移到开始处,准备读取文件 fp.seek(0) # 输出刚才写入的内容 print("读取的内容:",fp.read().decode('utf-8')) # 关闭文件,该文件将会被自动删除 fp.close() # 通过with语句创建临时文件,with会自动关闭临时文件 with tempfile.TemporaryFile() as fp: # 写入内容 fp.write(b'hello world') # 将文件指针移到开始处,准备读取文件 fp.seek(0) # 读取文件内容,打印 print("读取的内容:",fp.read()) # 通过with语句创建临时目录 with tempfile.TemporaryDirectory() as tmpdirname: print('创建临时目录:', tmpdirname) |