例如,在某项目中,我们从传感器采集数据,每收集到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.8G
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
>>> 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% / #已使用增加1G
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
>>> 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
创建命名临时文件更为合适。