Python的强大永远会带给我们意外的惊喜。最近在使用websocket时遇到了文件对象的传输问题:对于前端页面传来的文件流、字符串需要转为文件对象再传输给api接口。那么首先想到的是将文件流或字符串存入文件再从直接读取以获取文件文件对象,这种方式固然可行,但是弊端是需要额外占用空间来存储文件,当然我们也可以每次调用结束后清理文件,如果没有临时文件模块这也是一种可行的方式。
强大如python,拥有临时文件模块-tempfile,
这个模块可以产生临时文件或文件夹,并且支持所有的平台。
这个模块我们常用的方法如下:
tempfile.
TemporaryFile
([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])
这个方法会返回一个临时存储的文件对象, 这个文件对象将在使用close方法或垃圾回收后被销毁。在使用过程中不应该依赖于使用此函数创建的临时文件,该文件在文件系统中具有或不具有可见名称。这个方法创建的文件对象默认模式是“w+b”,bufsize默认为-1,表示使用操作系统默认值。
返回的对象在POSIX平台上的真实文件对象,在其他平台上,它是一个类文件对象,其file属性是底层的真实文件对象。这个类文件对象可以在with语句中使用,就像普通文件一样。
tempfile.
NamedTemporaryFile
([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
这个方法与TemporaryFile()基本相同,区别是它可以保证文件在文件系统中具有可见名称。可以从返回的类文件对象的name属性中检索该名称。名称可以用于第二次打开文件, 如果delete为true(默认值),则文件一关闭就会被删除。
>>> f = NamedTemporaryFile(delete=False)
>>> f ', mode 'w+b' at 0x384698>
>>> f.name '/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0'
>>> f.write("Hello World!\n")
>>> f.close() # 关闭即删除文件
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False
完整的文件流或字符串、字节串转文件对象的方法:
import tempfile
def string_to_file(string):
file_like_obj = tempfile.NamedTemporaryFile()
file_like_obj.write(string)
# 确保string立即写入文件
file_like_obj.flush()
# 将文件读取指针返回到文件开头位置
file_like_obj.seek(0)
return file_like_object
对于临时文件夹的创建使用的是:tempfile.
tempdir
>>> import tempfile
>>> tempfile.tempdir
# 返回临时文件夹路径
>>> tempfile.gettempdir() # 对于不同平台临时文件夹创建的路径也不一样
'c:\\users\\hlshang\\appdata\\local\\temp'
对于更多方法及使用可以参考官方文档。