经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python利用临时文件实现数据的保存
来源:jb51  时间:2022/7/20 13:09:18  对本文有异议

假设有一个 WebSocket 接口,会源源不断地产生数据,我们需要将其保存下来,然后进行处理。但由于数据量比较大,无法一次性加载到内存,最好的办法就是保存到文件里。

如果数据处理完毕,不再需要相关文件的话,那么我们可以使用临时文件。临时文件的最大好处就是,不用命名、并且关闭时会自动删除,而无需我们手动删。

下面我们来看看如何使用临时文件。

  1. import?tempfile
  2.  
  3. #?第一个参数是?mode,表示打开模式
  4. #?默认是?"wb+",二进制可读可写
  5. f?=?tempfile.TemporaryFile()
  6. #?假设我们写?1G?的数据
  7. f.write(b"+"?*?1024?*?1024?*?1024)
  8. #?此时文件指针会移动到末尾
  9. #?想要读取的话,需要移动到开头
  10. f.seek(0,?0)
  11. print(len(f.read()))
  12. """
  13. 1073741824
  14. """
  15. print(1073741824?==?1024?*?1024?*?1024)
  16. """
  17. True
  18. """

临时文件和真实文件的操作方法是一样的,因为临时文件本质上也属于文件,它的数据也存储在系统上,只不过我们不知道罢了。当调用 f.close(),临时文件就会被自动删除,占用的磁盘空间也会被释放。我们来验证一下:

  1. import?psutil
  2. import?tempfile
  3.  
  4. GB_UNIT?=?1024?*?1024?*?1024
  5.  
  6. #?临时文件默认存储在?C?盘
  7. #?我们查看已经使用的空间
  8. print(
  9. ????psutil.disk_usage("C:\\").used?/?GB_UNIT
  10. )??#?89.93075561523438
  11.  
  12. f?=?tempfile.TemporaryFile()
  13. #?写?1G?的数据
  14. f.write(b"+"?*?1024?*?1024?*?1024)
  15.  
  16. #?不出意外的话,应该增加?1G
  17. print(
  18. ????psutil.disk_usage("C:\\").used?/?GB_UNIT
  19. )??#?90.93075561523438
  20.  
  21. #?关闭临时文件,然后释放磁盘空间
  22. f.close()
  23. #?所以又会减少?1G
  24. print(
  25. ????psutil.disk_usage("C:\\").used?/?GB_UNIT
  26. )??#?89.93075561523438

输出一切正常,所以结论如下:

  • 临时文件本质上也是文件,它在存储数据的时候,也是存储在磁盘上,和真实文件并无二致;
  • 临时文件的调用属于操作系统级别的,所以它的创建、读写数据,最终都会走操作系统提供的系统调用;
  • 临时文件在被关闭时,操作系统会自动删除;

然后我们还可以指定临时文件的存储位置,虽然临时文件关闭时会自动删除,但我们还是希望它能存储在指定的位置上。

  1. import?tempfile
  2. import?time
  3.  
  4. f?=?tempfile.TemporaryFile(dir=r"E:\data")
  5. time.sleep(30)

为了观察到现象,这里 sleep 了 30 秒。执行时,打开目录,会发现文件创建了,并且操作系统帮我们起了个名字。

等 30 秒过后,文件又被自动删除了。

然后 TemporaryFile 里面还接收其它参数,我们来看一下:

大部分参数和内置函数 open 类似,但里面有一个 prefix 和 suffix 参数。因为临时文件也是文件,也要存储在磁盘上,只不过关闭之后会自动删除。所以它也要有一个名字,默认名字的前缀是 "tmp",没有后缀,而我们可以指定前缀和后缀,举个例子:

  1. import?tempfile
  2. import?time
  3.  
  4. f?=?tempfile.TemporaryFile(dir=r"E:\data",
  5. ???????????????????????????prefix="你好呀",
  6. ???????????????????????????suffix="我不好")
  7. time.sleep(30)

执行一下看看:

此时文件的前缀和后缀就被我们改掉了,不过说实话这个前缀和后缀没太大卵用,既然是临时文件,用完就删除了,名字没太大关注的必要。

那么问题来了,如果不指定 dir 参数,我们就不知道文件存在哪了吗?显然不是的,默认存在什么地方,tempfile 已经提前告诉我们了。

  1. import?tempfile
  2.  
  3. #?Linux?系统是?/tmp
  4. print(
  5. ????tempfile.gettempdir()
  6. )??#?C:\Users\satori\AppData\Local\Temp
  7. #?返回二进制结果
  8. print(
  9. ????tempfile.gettempdirb()
  10. )??#?b'C:\\Users\\satori\\AppData\\Local\\Temp'
  11.  
  12. #?获取前缀
  13. print(
  14. ????tempfile.gettempprefix()
  15. )??#?tmp
  16. #?返回二进制结果
  17. print(
  18. ????tempfile.gettempprefixb()
  19. )??#?b'tmp'

最后想说的是,临时文件也可以使用 mmap 进行映射。

  1. import?tempfile
  2. import?mmap
  3.  
  4. f?=?tempfile.TemporaryFile()
  5. f.write(b"hello,?world")
  6. #?映射之前需要移动一下光标
  7. f.seek(0,?0)
  8. #?mmap?映射,这里就映射?5?字节
  9. m?=?mmap.mmap(f.fileno(),?5)
  10. m[:]?=?b"HELLO"
  11.  
  12. #?再次打印
  13. print(f.read())
  14. """
  15. b'HELLO,?world'
  16. """

以上就是临时文件的用法,当然 tempfile 还提供了其它的操作,有兴趣可以了解一下,但使用最普遍的还是 TemporaryFile。

到此这篇关于Python利用临时文件实现数据的保存的文章就介绍到这了,更多相关Python临时文件保存数据内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号