使用pyfilesystem在python中创建一个只有内存的文件对象

时间:2015-08-31 23:05:38

标签: python memory filesystems

我使用opencv2编写了一个运动检测/视频程序,可以将视频输出保存x秒。如果在此期间检测到运动,则输出将保存为备用命名文件,但如果未检测到运动,则会覆盖该文件。为了避免基于闪存的内存系统出现不必要的磨损,我想将文件写入RAM,如果检测到运动,则将其保存到非易失性存储器中。

我正在尝试使用pyfilesystem-fs.memoryfs

在RAM中创建此文件
import numpy as np
import cv2, time, os, threading, thread
from Tkinter import *
from fs.memoryfs import MemoryFS

class stuff:

    mem=MemoryFS()
    output = mem.createfile('output.avi')
    rectime=0
    delay=0
    kill=0
    cap = cv2.VideoCapture(0)
    #out = cv2.VideoWriter('C:\motion\\output.avi',cv2.cv.CV_FOURCC('F','M','P','4'), 30, (640,480),True)
    out = cv2.VideoWriter(output, cv2.cv.CV_FOURCC('F','M','P','4'), 30, (640,480),True)

这是动作检测部分

if value > 100:
        print "saving"
        movement=time.time()
        while time.time()<int(movement)+stuff.rectime:
            stuff.out.write(frame)
            ret, frame = stuff.cap.read()


        if stuff.out.isOpened() is True:
            stuff.out.release()
        os.rename(stuff.output, 'c:\motion\\' + time.strftime('%m-%d-%y_%H-%M-%S') + '.avi')

os.rename函数返回TypeError must be string, not None

我显然错误地使用了memoryfs,但找不到任何使用它的例子。

EDIT 我使用以下行打开文件对象并写入

stuff.out.open(stuff.output, cv2.cv.CV_FOURCC(*'FMP4'),24,(640,480),True)

然而这会返回False,我不确定,但似乎无法打开文件对象。

1 个答案:

答案 0 :(得分:1)

要将文件从MemoryFS移动到真实文件系统,您应该读取orig文件并将其写入dest文件,例如

with mem.open('output.avi', 'b') as orig:
    with open('c:\\motion\\' + time.strftime('%m-%d-%y_%H-%M-%S') + '.avi')) as dest:
        dest.write(orig.read())