文件对象 、 函数基础 、 模块基础案例

Top

NSD Python1 DAY03

  1. 案例1:模拟cp操作
  2. 案例2:生成随机密码

1 案例1:模拟cp操作

1.1 问题

创建cp.py文件,实现以下目标:

  1. 将/bin/ls“拷贝”到/root/目录下
  2. 不要修改原始文件

1.2 方案

获取用户原文件名和新文件名,打开原文件,打开新文件,从打开的原文件中读取数据,写入到打开的新文件中,关闭两个文件

cp代码的过程中,需要注意的部分在于:

如果一个文件过大,你将无法直接读取数据到内存,此时,使用while循环语句,分次读取数据,每次读4096字节,读取数据为空时,结束循环,将数据写入到目标文件

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

 
  1. [root@localhost day03]# vim cp.py
  2. #!/usr/bin/env python3
  3.  
  4. f1 = open('/bin/ls', 'rb')
  5. f2 = open('/root/ls', 'wb')
  6.  
  7. data = f1.read()
  8. f2.write(data)
  9.  
  10. f1.close()
  11. f2.close()

或将上面的代码改为以下写法:

循环读取文件中数据,避免读取数据过大

 
  1. [root@localhost day03]# vim cp2.py
  2. #!/usr/bin/env python3
  3.  
  4. src_fname = '/bin/ls'
  5. dst_fname = '/tmp/ls'
  6.  
  7. src_fobj = open(src_fname, 'rb')
  8. dst_fobj = open(dst_fname, 'wb')
  9.  
  10. while True:
  11. data = src_fobj.read(4096) # 每次读4096字节
  12. if data == b'': # 读不到数据意味着读写完毕,中断循环
  13. break
  14. dst_fobj.write(data) # 将数据写到目标文件
  15.  
  16. src_fobj.close()
  17. dst_fobj.close()

或将上面的代码改为以下写法:

With打开文件读取数据或写入数据后,文件会直接关闭

 
  1. [root@localhost day03]# vim cp3.py
  2. #!/usr/bin/env python3
  3.  
  4. src_fname = '/bin/ls'
  5. dst_fname = '/root/ls'
  6.  
  7. with open(src_fname, 'rb') as src_fobj:
  8. with open(dst_fname, 'wb') as dst_fobj:
  9. while True:
  10. data = src_fobj.read(4096)
  11. if not data:
  12. break
  13. dst_fobj.write(data)

或将上面的代码改为以下写法:

sys.argv方法表示空列表,执行脚本时输入命令: python3 cp_func.py /bin/ls /root/ls,表示sys.argv=[cp_func.py,‘/bin/ls’,‘/root/ls’],所以,调用copy函数时,列表切片方式获取实参为(‘/bin/ls’,‘/root/ls’)

 
  1. [root@localhost day03]# vim cp_func.py
  2. #!/usr/bin/env python3
  3.  
  4. import sys
  5.  
  6. def copy(src_fname, dst_fname):
  7. src_fobj = open(src_fname, 'rb')
  8. dst_fobj = open(dst_fname, 'wb')
  9.  
  10. while True:
  11. data = src_fobj.read(4096)
  12. if not data:
  13. break
  14. dst_fobj.write(data)
  15.  
  16. src_fobj.close()
  17. dst_fobj.close()
  18.  
  19. copy(sys.argv[1], sys.argv[2])

步骤二:测试脚本执行

 
  1. [root@localhost day03]# python3 cp.py
  2. [root@localhost day03]# cd /root
  3. [root@localhost ~]# ls
  4. core ls
  5.  
  6. [root@localhost day03]# python3 cp2.py
  7. [root@localhost day03]# cd /root
  8. [root@localhost ~]# ls
  9. core ls
  10.  
  11. [root@localhost day03]# python3 cp3.py
  12. [root@localhost day03]# cd /root
  13. [root@localhost ~]# ls
  14. core ls
  15.  
  16. [root@localhost day03]# python3 cp_func.py /bin/ls /root/ls
  17. [root@localhost day03]# cd /root
  18. [root@localhost ~]# ls
  19. core ls

2 案例2:生成随机密码

2.1 问题

创建randpass.py脚本,要求如下:

  1. 编写一个能生成8位随机密码的程序
  2. 使用random的choice函数随机取出字符
  3. 改进程序,用户可以自己决定生成多少位的密码

2.2 方案

导入random模块,通过random静态对象调用choice()方法,从自定义字符串all_chs中获取随机项,将获取到的随机字符ch与原result值进行拼接,将最终字符串结果返回给函数,for循环每循环一次获取一个随机字符,密码位数由循环次数决定,循环次数由传递参数值决定。

此程序需要注意的部分在于:

1.导入String模块,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9

2.将整个生成随机密码的代码封装进gen_pass()函数中,当模块文件直接执行时,调用函数即可输出结果

3.参数传递问题:调用函数无实参时,函数调用默认参数,有实参时,函数调用实际参数

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

 
  1. [root@localhost day03]# vim randpass.py
  2. #!/usr/bin/env python3
  3. import random
  4. import string
  5.  
  6. all_chs = string.digits + string.ascii_letters
  7.  
  8. def gen_pass(n=8):
  9. result = ''
  10.  
  11. for i in range(n):
  12. ch = random.choice(all_chs)
  13. result += ch
  14. return result
  15.  
  16. if __name__ == '__main__':
  17. print(gen_pass())
  18. print(gen_pass(4))

或将上面的代码改为以下写法:

利用列表推导式更简洁输出数据

 
  1. [root@localhost day03]# vim randpass2.py
  2. #!/usr/bin/env python3
  3.  
  4. from random import choice
  5. from string import ascii_letters, digits
  6.  
  7. all_chs = ascii_letters + digits
  8.  
  9.  
  10. def randpass(n=8):
  11. result = [choice(all_chs) for i in range(n)]
  12. return ''.join(result) # 将列表的字符拼接起来
  13.  
  14.  
  15. if __name__ == '__main__':
  16. print(randpass())
  17. print(randpass(4))

步骤二:测试脚本执行

 
  1. [root@localhost day03]# python3 randpass.py
  2. 82wi2gOP
  3. XzMi
  4. [root@localhost day03]# python3 randpass.py
  5. 5wMoDEgC
  6. BDpc
  7. [root@localhost day03]# python3 randpass.py
  8. Ige2VGod
  9. Az0z
  10. [root@localhost day03]# python3 randpass2.py
  11. eajAocMH
  12. edW1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值