最近看了下《A Byte of Python》, 看见一个非常有意思的程序,用python进行文件行备份的练习程序, 自己在机器上敲代码运行了一遍,结果出现了一个小问题,路径出错——“找不到压缩软件”,网上搜答案,发现很多人都用python实现了这个功能,而且都是原创,高兴之余,心里面很佩服他们。
不过仔细一看,却发现这些程序中,居然有很多跟《A Byte of Python》中的一模一样,有一些进步点,多一些print提示信息。实际运行起来都是各种问题。顿时感到有些无语,所谓原创,居然是这样子。我想这应该就是国内网络上的一个通病吧,所以有问题还是多去国外论坛交流交流甚好,比如说 stackoverfolow.
我来贴上自己的代码:
1 import os 2 import time 3 4 #1.需要备份的文件夹或者文件 5 source = ['D:\\backup'] 6 #2.需要备份的存放目录 7 target_dir = 'D:\\work\\' 8 #3.要压缩的文件, windows 上通过winrar进行 9 target = target_dir +time.strftime('%Y%m%d%H%M%S') +'.7z'10 #4.通过WinRAR进行压缩打包11 zip_command = 'rar a %s %s' % (target, ''.join(source)) //使用join()方法来拼接字符串12 #5.运行脚本进行备份13 if os.system(zip_command) == 0:14 print 'successful backuped ',target15 else:16 print "backup failed"
在这个程序中我遇到了最主要的问题就是windows 平台没有想linux自带的zip命令,所以我们需要安装解压缩软件设置环境变量后才可以正常运行上述的备份程序。
可以安装7zip或者winrar都可以,只需要更换命令行参数即可, 如果使用7zip 那么11行要更改为7z 如果是winrar 更改为rar。
记得添加完压缩软件环境变量后,关掉CMD 重新打开下cmd,至于为什么,说出来都是泪!
附上程序中使用的join()方法:
join()函数
语法: 'sep'.join(seq)
参数说明
sep:分隔符。可以为空‘’seq:要连接的元素序列、字符串、元组、字典上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串返回值:返回一个以分隔符sep连接各个元素后生成的字符串
>>> seq = ['hello','good','boy']
>>> print ''.join(seq)hellogoodboy>>> print ' '.join(seq)hello good boy>>>
下面这个是一个完整的代码,可以根据自己修改的记录来自定义备份的文件夹
1 #!C:\Python27 2 # -*- coding: utf-8 -*- 3 4 import os 5 import time 6 7 #1.需要备份的文件夹或者文件 8 source = ['D:\\backup'] 9 #2.需要备份到的目录10 target_dir = 'D:\\work\\'11 #3.today 是以当前日期命令的目录12 today = target_dir + time.strftime('%Y%m%d')13 #4.当前时间是压缩文件名字14 now = time.strftime('%H%M%S')15 #5.判断用户输入的信息,如果输入了信息那么就添加到文件名上16 comment = raw_input("enter a comment:")17 if len(comment)==0:18 target = today + os.sep+now+'.zip'19 else:20 target = today +os.sep +now +'_'+ comment.replace(' ','_')+'.zip'21 22 #6.判断是否存在对应的文件夹23 if not os.path.exists(today):24 os.mkdir(today)25 print 'scuessfully created directory',today26 27 #7. 创建压缩脚本28 zip_command = 'rar a %s %s' %(target, ''.join(source))29 #8运行脚本30 if os.system(zip_command)==0:31 print 'scuessfully backup to ',target32 else:33 print 'backup failed'
os.sep
注意 os.sep 变量的用法——这会根据你的操作系统给出目录分隔符,即在Linux、Unix下它是 '/' ,在
Windows下它是 '\\' ,而在Mac OS下它是 ':' 。使用 os.sep 而非直接使用字符,会使我们的程序具有移植性,可以在上述这些系统下工作。