文件夹和数据库备份 - Python
我觉得这个问题有点复杂,
我有很多文件夹,里面有我想要备份的项目,我希望把它们打包成一个zip或tar文件,但我想避免备份像pyc文件和临时文件这样的东西。
我还有一个需要备份的Postgres数据库。
有没有什么建议可以让我用Python脚本来完成这个操作呢?
另外,有没有办法让这个过程不占用太多资源呢?
非常感谢大家的帮助。
4 个回答
现在的多核CPU让我们发现,CPU并不是性能瓶颈。更常见的情况是,磁盘的读写速度(也就是磁盘I/O)需要更好的管理。
在Linux系统中,有一个叫做ionice的命令,可以帮助你控制这个问题。
ionice(1)
名称
ionice - get/set program io scheduling class and priority
使用方法
ionice [[-c class] [-n classdata ] [-t]] -p PID [PID ...] ionice [-c class] [-n classdata ] [-t] COMMAND [ARG ...]
描述
这个程序可以设置或获取一个程序的I/O调度类别和优先级。如果没有提供任何参数,或者只提供了-p,ionice会查询当前进程的I/O调度类别和优先级。
在Linux系统中,你可以使用tar命令,并加上--exclude
这个选项来排除一些文件。比如说,如果你想排除你的.pyc
文件和临时文件(在这个例子中是.tmp
文件),可以这样做:
$ tar zcvf backup.tar.gz --exclude "*.tmp" --exclude "*.pyc"
另外,你还可以使用z
选项来把文件压缩成一个压缩包。
如果你在使用Linux(或者其他类似Unix的系统,比如MacOSX),有一个简单的方法可以降低一个程序的优先级——这样的话,如果其他程序需要CPU资源,它就会消耗更少的CPU。这可以通过使用nice命令来实现。在Python中(同样适用于这些操作系统),你可以使用os.nice来让你的程序“变得更友好”(也就是降低优先级等)。
如果你想备份一个PostgreSQL数据库,我推荐使用PostgreSQL自带的工具。至于压缩一个文件夹,除了.pyc文件(还有临时文件——你可以用你自己的方法来识别这些文件),Python也非常合适。比如:
>>> os.chdir('/tmp/az')
>>> f = open('/tmp/a.zip', 'wb')
>>> z = zipfile.ZipFile(f, 'w')
>>> for root, dirs, files in os.walk('.'):
... for fn in files:
... if fn.endswith('.pyc'): continue
... fp = os.path.join(root, fn)
... z.write(fp)
...
>>> z.close()
>>> f.close()
>>>
这段代码会压缩指定文件夹中的所有文件,除了那些以.pyc
结尾的文件(不进行压缩——如果你想要压缩,可以在zipfile.ZipFile
调用中添加第三个参数zipfile.ZIP_DEFLATED
)。这真是太简单了。