24. 使用临时文件

例如,在某项目中,我们从传感器采集数据,每收集到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打开一个文件,返回一个文件描述符(整数)。当flagsO_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创建命名临时文件更为合适。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值