例如,在某项目中,我们从传感器采集数据,每收集到1G数据后,做数据分析,最终只保存分析结果。这样很大的临时文件如果常驻内存,将消耗大量内存资源。
要求:使用临时文件存储这些临时数据(外部存储)。临时文件不用命名,且关闭后会自动被删除。
解决方案:
使用标准库中的TemporaryFile
(临时文件)以及NamedTemporaryFile
(命名临时文件)。
TemporaryFile()
:TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None)
创建并返回一个临时文件,该文件在文件系统中无法访问。mode默认是二进制可读可写。
NamedTemporaryFile()
:NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True)
创建并返回一个命名的临时文件,该文件在文件系统中可访问,这是Python库对临时文件进行操作的。delete=True
表示文件在关闭时删除。
os.open()
方法:os.open(path, flags, mode=511, *, dir_fd=None)
为低级别IO打开一个文件,返回一个文件描述符(整数)。当flags
为O_TMPFILE
时会创建一个临时文件,关闭时删除,这是操作系统对临时文件进行操作。且指定路径为目录(不是文件),即在该目录下创建临时文件。
# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 5.8G 13G 33% / #当前已使用5.8Gdevtmpfs 900M 0 900M 0% /dev tmpfs 910M 0 910M 0% /dev/shm tmpfs 910M 9.5M 901M 2% /run tmpfs 910M 0 910M 0% /sys/fs/cgroup /dev/sda1 197M 148M 50M 75% /boot tmpfs 182M 0 182M 0% /run/user/0
>>> from tempfile import TemporaryFile, NamedTemporaryFile>>> tf = TemporaryFile()>>> tf.write(b'*' * 1024 * 1024 * 1024) #写入1G到临时文件中1073741824
# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 6.8G 12G 38% / #已使用增加1Gdevtmpfs 900M 0 900M 0% /dev tmpfs 910M 0 910M 0% /dev/shm tmpfs 910M 9.5M 901M 2% /run tmpfs 910M 0 910M 0% /sys/fs/cgroup /dev/sda1 197M 148M 50M 75% /boot tmpfs 182M 0 182M 0% /run/user/0
>>> tf.close() #关闭临时文件
# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 5.8G 13G 33% / #已使用恢复devtmpfs 900M 0 900M 0% /dev tmpfs 910M 0 910M 0% /dev/shm tmpfs 910M 9.5M 901M 2% /run tmpfs 910M 0 910M 0% /sys/fs/cgroup /dev/sda1 197M 148M 50M 75% /boot tmpfs 182M 0 182M 0% /run/user/0
>>> ntf = NamedTemporaryFile()>>> ntf.name'/tmp/tmpvkj005cs' #该临时文件名
# ll '/tmp/tmpvkj005cs'-rw------- 1 root root 0 Sep 12 10:17 /tmp/tmpvkj005cs
NamedTemporaryFile()
创建的临时文件名是通过suffix=None, prefix=None, dir=None
这几个参数来决定的。
>>> import tempfile>>> tempfile.gettemp tempfile.gettempdir( tempfile.gettempdirb( tempfile.gettempprefix( tempfile.gettempprefixb( >>> tempfile.gettempdir() #默认目录'/tmp'>>> tempfile.gettempprefix() #默认前缀'tmp'
这些默认参数都是可修改的。
>>> ntf.close()
# ll '/tmp/tmpvkj005cs'ls: cannot access /tmp/tmpvkj005cs: No such file or directory
临时文件关闭后会自动删除,这是因为delete
参数默认为True。
通常情况下使用TemporaryFile
创建临时文件即可,但是在多进程都想访问同一临时文件时,使用NamedTemporaryFile
创建命名临时文件更为合适。