第10篇,解决一个问题,运用Python来备份指定文件

通过解决一个问题,来学习解决问题的思路。

------ZYiDa弗拉斯基
思路
  • 需要备份的文件与目录应在一份列表中指定出来
  • 备份必须存储在主备份目录中
  • 备份文件打包压缩成zip文件
  • zip文件名的格式为“当前日期时间 + .zip
  • 我们使用在任何Linux/Unix发行版本中都会提供的标准zip命令进行打包。
    只要有命令行界面,我们就可以使用任何需要用到的压缩和归档命令。

Debug阶段的代码

详细的说明都在注释里面了。

import os
import time

# 以MacOS下为例,win下面的路径不一样
# 需要备份的文件的目录路径
source = ['/Users/a1/Desktop/ZAlertViewDemo']

# 备份的目标路径
target_dir = '/Users/a1/Desktop/ZAlert'

# 备份的文件名称:'当前日期时间+.zip',文件路径为:目标路径+文件名称
# time.strftime() 创建日期时间
# os.sep 根据系统来给出对应的分隔符
target = target_dir + os.sep + time.strftime('%Y%m%H%M%S') + '.zip'

# 如果备份的目标文件路径不存在,就创建该路径。
if not  os.path.exists(target_dir):
    os.makedirs(target_dir)

# 使用zip压缩命令来打包压缩文件成zip格式
# -r选项 用以指定zip命令应该递归地对目录进行压缩工作
# 也就是说它应该包括所有的子文件夹与其中的文件
# zipCommand = "zip -r {} {}".format(target, ''.join(source))
zipCommand = f"zip -r {target} {''.join(source)}"

# 输出压缩过程的信息
print('zipCommand is :')
print(zipCommand)
print('Running:')

# 处理压缩的结果
if os.system(zipCommand) == 0:
    print('Successful backup to :',target)
else:
    print('Backup failed.')

输出信息

zipCommand is :
zip -r /Users/a1/Desktop/ZAlert/201712100550.zip /Users/a1/Desktop/ZAlertViewDemo
Running:
  adding: Users/a1/Desktop/ZAlertViewDemo/podfile (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/README.md (deflated 12%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/.DS_Store (deflated 93%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/AppDelegate.h (deflated 23%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/AppDelegate.m (deflated 58%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/AppIcon.appiconset/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/AppIcon.appiconset/Contents.json (deflated 84%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/LaunchScreen.storyboard (deflated 57%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/Main.storyboard (deflated 71%)
Successful backup to : /Users/a1/Desktop/ZAlert/201712100550.zip

Process finished with exit code 0

Maintenance维护阶段

维护阶段的需求更改

  • 用日期做文件夹名称 ,在该目录下存储当天的备份,这个文件夹在主备份目录下。

请看下面的代码

import os
import time

# 需要备份的文件路径
source = ['/Users/a1/Desktop/ZAlertViewDemo']

# 主备份目录
target_main_dir = '/Users/a1/Desktop/BackpackTestFile'
if  not os.path.exists(target_main_dir):
    os.makedirs(target_main_dir)

# 将当前日期作为当前主备份目录下的总目录
today = target_main_dir + os.sep + time.strftime('%Y%m%d')
if not  os.path.exists(today):
    os.makedirs(today)
    print("File path create Successful!")

# 获取当前时间,转化为字符串,作为备份文件的名称
now = time.strftime('%H%M%S')

# 备份文件的'路径+文件名'
file_target = today + os.sep +now + '.zip'

# 调用zip命令
zipCommand = "zip -r {} {}".format(file_target,''.join(source))

#输出压缩过程信息
print("Zip command is :")
print(zipCommand)
print("Start Running!")

# 判断压缩的结果信息
if os.system(zipCommand) == 0:
    print("Successful backpack file to path:",file_target)
else:
    print("Filed backpack.")
Zip command is :
zip -r /Users/a1/Desktop/BackpackTestFile/20171221/102959.zip /Users/a1/Desktop/ZAlertViewDemo
Start Running!

  adding: Users/a1/Desktop/ZAlertViewDemo/.git/objects/info/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/objects/pack/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/ORIG_HEAD (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/heads/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/heads/master (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/remotes/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/remotes/origin/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/remotes/origin/master (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/remotes/origin2/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/remotes/origin2/master (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/refs/tags/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/.git/sourcetreeconfig (deflated 40%)
  adding: Users/a1/Desktop/ZAlertViewDemo/LICENSE (deflated 41%)
  adding: Users/a1/Desktop/ZAlertViewDemo/podfile (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/README.md (deflated 12%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/.DS_Store (deflated 93%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/AppDelegate.h (deflated 23%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/AppDelegate.m (deflated 58%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/AppIcon.appiconset/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/AppIcon.appiconset/Contents.json (deflated 84%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/LaunchScreen.storyboard (deflated 57%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/Main.storyboard (deflated 71%)
Successful backpack file to path: /Users/a1/Desktop/BackpackTestFile/20171221/102959.zip

Process finished with exit code 0

Bug Fixing 错误修复

下面的代码看似很正确,但是却不能正常运行。不过我们可以从下面学习到解决问题的思路

import os
import time

source = ['/Users/a1/Desktop/ZAlertViewDemo']

tatget_main_dir = '/Users/a1/Desktop/backup_test2'
if not os.path.exists(tatget_main_dir):
    os.makedirs(tatget_main_dir)

today = tatget_main_dir + os.sep + time.strftime('%Y%m%d')
if not os.path.exists(today):
    os.makedirs(today)

now = time.strftime('%H%M%S')

comment = input('请输入文件名前缀:')
if len(comment) == 0:
    file_taget_dir = tatget_main_dir + today + os.sep + now + '.zip'
else:
    file_taget_dir = tatget_main_dir + today + os.sep + comment + '_' + now + '.zip'

zipCommand = "zip -r {} {}".format(file_taget_dir,''.join(source))

print("Zip conmand is ",zipCommand)
print("Start Running!")
print(zipCommand)

if os.system(zipCommand) == 0:
    print("Successful backup to path :",file_taget_dir)
else:
    print("Backup Filed.")

运行报错,控制台输出结果

请输入文件名前缀:ert
Zip conmand is  zip -r /Users/a1/Desktop/backup_test2/Users/a1/Desktop/backup_test2/20171221/ert_110054.zip /Users/a1/Desktop/ZAlertViewDemo
Start Running!
zip -r /Users/a1/Desktop/backup_test2/Users/a1/Desktop/backup_test2/20171221/ert_110054.zip /Users/a1/Desktop/ZAlertViewDemo
zip I/O error: No such file or directory
zip error: Could not create output file (/Users/a1/Desktop/backup_test2/Users/a1/Desktop/backup_test2/20171221/ert_110054.zip)
Backup Filed.

Process finished with exit code 0

从上面的输出信息可以看到,错误信息是找不到文件或者文件夹信息。
经过一步一步排查,发现问题出现在下面的区域

if len(comment) == 0:
    file_taget_dir = tatget_main_dir + today + os.sep + now + '.zip'
else:
    file_taget_dir = tatget_main_dir + today + os.sep + comment + '_' + now + '.zip'

因为在设置备份文件路径时,我们多加了一个tatget_main_dir造成了路径错误,从而无法进行备份。
去除掉上面代码中的tatget_main_dir +,再次运行就正常了,
请看正常后的输出信息

请输入文件名前缀:qwert
Zip conmand is  zip -r /Users/a1/Desktop/backup_test2/20171221/qwert_110447.zip /Users/a1/Desktop/ZAlertViewDemo
Start Running!
zip -r /Users/a1/Desktop/backup_test2/20171221/qwert_110447.zip /Users/a1/Desktop/ZAlertViewDemo
  adding: Users/a1/Desktop/ZAlertViewDemo/podfile (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/README.md (deflated 12%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/.DS_Store (deflated 93%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/AppDelegate.h (deflated 23%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/AppDelegate.m (deflated 58%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/AppIcon.appiconset/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Assets.xcassets/AppIcon.appiconset/Contents.json (deflated 84%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/ (stored 0%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/LaunchScreen.storyboard (deflated 57%)
  adding: Users/a1/Desktop/ZAlertViewDemo/ZAlertViewDemo/Base.lproj/Main.storyboard (deflated 71%)
Successful backup to path : /Users/a1/Desktop/backup_test2/20171221/qwert_110447.zip

Process finished with exit code 0

关于zip命令的两个说明

  • zipCommand = "zip -r -v {} {}".format(file_taget_dir,''.join(source)),在zip命令中添加-v能更加详细的显示压缩的过程进行信息。
  • zipCommand = "zip -r -q {} {}".format(file_taget_dir,''.join(source))则能使程序静默进行,不显示输出压缩过程的进行信息。

总结-软件开发的流程

由上面处理问题的思路,可以总结一下软件开发的流程

  • What/做什么 (分析)
  • How/怎么做 (设计)
  • Do It/开始做 (执行)
  • Test/测试 (测试与修复错误)
  • Use/使用 (操作或开发)
  • Maintain/维护(改进)
未命名文件.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352