首页 > 系统相关 >使用pyfakefs在内存中创建文件,而非硬盘

使用pyfakefs在内存中创建文件,而非硬盘

时间:2023-01-30 17:35:37浏览次数:43  
标签:文件 模块 pyfakefs 内存 file path os 硬盘


pyfakefs 是一个假文件系统,它模拟的是python的文件系统,简单来说,它提供了和python的os模块,Path模块一样的功能,所有的文件操作,例如创建,修改,删除,重命名等操作都是在内存中进行的。

做出一个假的文件系统,有什么用处呢,我最开始看到这个模块的介绍时,心中是一样的疑问,直至看到它的示例,才明白它的奥妙之处。我们在编写python模块时,如果这个模块的功能是和文件操作有关的,比如遍历某个文件夹,移动一些文件到另一个文件夹,如果你想做单元测试,就必须准备这些文件,麻烦的是随着测试的进行,这些文件都发生了变化,再次进行测试的时候,不得不重新创建他们。

pyfakefs就可以解决上面所提到的麻烦,来看一下官方示例

import os
from pyfakefs.fake_filesystem_unittest import TestCase

class ExampleTestCase(TestCase):
def setUp(self):
self.setUpPyfakefs()

def test_create_file(self):
file_path = '/test/file.txt'
self.assertFalse(os.path.exists(file_path))
self.fs.create_file(file_path)
self.assertTrue(os.path.exists(file_path))

self.fs.create_file(file_path) 创建了目标文件,第二个断言仍然是正确的,os.path.exists会认为这个文件是真实存在的,但/test/file.txt 从来没有在硬盘上被创建过,它只存在于内存中。os.path.exists方法之所以判断它存在,是因为pyfakefs对os模块打了补丁,或者说,已经替换掉了python内置的os模块。

pyfakefs 可以和pytest,unittest结合使用,也可以直接使用fake_filesystem_unittest.Patcher 来构建假的文件系统。

from pyfakefs.fake_filesystem_unittest import Patcher

patcher = Patcher()
patcher.setUp()

os.mkdir('hhh')
os.mkdir('hhh/ttt')
print(os.path.exists('hhh'))
print(os.listdir('hhh'))

with open('hhh/1.txt', 'w')as f:
f.write('ok')

with open('hhh/1.txt', 'r')as f:
print(f.read())

上面的代码,即便创建的文件夹目录是linux的格式,你却可以在windows下运行,打开文件,写入数据,读取数据,你在做文件操作时,感受不到任何变化,但这些文件从未在硬盘上存在过。

pyfakefs 支持python3.6+, 由于其实现的原理是通过打补丁的方式替换python内置的文件操作相关模块,因此如果一个文件操作的底层使用了c库,pyfakefs则不能保证正常运行,比如lxml 模块。

使用pip安装pyfakefs

pip install pyfakefs

使用这个模块,你对文件系统的任何操作都是在内存层面上的操作,不会影响到硬盘,这样带来的好处就是避免对硬盘上的文件造成不可挽回的破坏,在测试场景下,可以反复构建用于测试的文件环境,不需要任何人工参与。


标签:文件,模块,pyfakefs,内存,file,path,os,硬盘
From: https://blog.51cto.com/u_15948370/6027505

相关文章

  • 【KAWAKO】python查看内存空间占用情况
    目录查看变量的内存占用查看运行内存占用查看变量的内存占用importsysc=1145.114print(sys.getsizeof(c))查看运行内存占用importpsutilmemory=psutil.vir......
  • 如何测试监测 app 的内存使用、CPU 消耗、流量使用情况?
    adbshelltopAndroid   应用性能测试通常包括:启动时间、内存、CPU、耗电量、流量、流畅度等根据手机的使用应用频度和强度不同,可将应用使用强度分为如下几种状态:1、......
  • Linux 硬盘分区管理:fdisk、sfdisk、sgdisk
    fdisk不必多言。sfdisk参考:管理磁盘分区的Linuxsfdisk命令示例sgdisk参考:使用sgdisk管理分区......
  • 如何避免内存泄漏
    对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。这些的确是消耗了开发人员大多数调试时间的事项。指针和内存泄漏对某些......
  • 第一次内存不兼容问题
    厂商:宏基类型:笔记本型号:记不清太乱cpu:amdr5pro4650u问题:内存不同厂商不同颗粒数,更换一致后解决。大概情况:两根16g内存都是寨条,前后购买用在也是宏基的本子,cpu是i5......
  • Linux 内存地址为何是从 0x7c00 开始 All In One
    Linux内存地址为何是从0x7c00开始AllInOneassemblylanguageprogramminghttps://en.wikipedia.org/wiki/Assembly_languagehttps://zh.wikipedia.org/wiki/......
  • [快速学]Dev C++查看内存中的值
    1、获得a在内存中的地址print/x&a2、查看内存中的值可以看到a在内存中的地址为0x62fe1cx/32bc0x62fe1c可看到内存0x62fe1c处存储的值为10(竟然是十进制显示的),后......
  • Armbian挂载硬盘(以及自动挂载)
    (一)Filesystem文件系統size文件大小Used使用空间Mountedon挂载的目录、查看系统所检测到的磁盘,这里的sda1检测到的硬盘但是没有被挂载(注意:这里sda1是’1’而不是......
  • python 实现app性能测试(cpu、内存占用情况)
    一、获取appcpu占用情况1、实现代码importos,csvimporttimeimportnumpyasnpfrommatplotlibimportpyplotaspltfromcheck_packageimportcheck_package......
  • jvm内存调优
    一、jvm内存调优主要的目的是减小GC的频率和FullGC的次数。1.FullGC会对整个堆进行整理,包括Young、Tenured和Perm。FullGC由于须要对整个堆进行回收,因此比较慢,所以应......