例如,在某项目中,我们从传感器采集数据,每收集到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 创建命名临时文件更为合适。
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did126723