创建cp.py文件,实现以下目标:
获取用户原文件名和新文件名,打开原文件,打开新文件,从打开的原文件中读取数据,写入到打开的新文件中,关闭两个文件
cp代码的过程中,需要注意的部分在于:
如果一个文件过大,你将无法直接读取数据到内存,此时,使用while循环语句,分次读取数据,每次读4096字节,读取数据为空时,结束循环,将数据写入到目标文件
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@localhost day03]# vim cp.py
- #!/usr/bin/env python3
- f1 = open('/bin/ls', 'rb')
- f2 = open('/root/ls', 'wb')
- data = f1.read()
- f2.write(data)
- f1.close()
- f2.close()
或将上面的代码改为以下写法:
循环读取文件中数据,避免读取数据过大
- [root@localhost day03]# vim cp2.py
- #!/usr/bin/env python3
- src_fname = '/bin/ls'
- dst_fname = '/tmp/ls'
- src_fobj = open(src_fname, 'rb')
- dst_fobj = open(dst_fname, 'wb')
- while True:
- data = src_fobj.read(4096) # 每次读4096字节
- if data == b'': # 读不到数据意味着读写完毕,中断循环
- break
- dst_fobj.write(data) # 将数据写到目标文件
- src_fobj.close()
- dst_fobj.close()
或将上面的代码改为以下写法:
With打开文件读取数据或写入数据后,文件会直接关闭
- [root@localhost day03]# vim cp3.py
- #!/usr/bin/env python3
- src_fname = '/bin/ls'
- dst_fname = '/root/ls'
- with open(src_fname, 'rb') as src_fobj:
- with open(dst_fname, 'wb') as dst_fobj:
- while True:
- data = src_fobj.read(4096)
- if not data:
- break
- 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’)
- [root@localhost day03]# vim cp_func.py
- #!/usr/bin/env python3
- import sys
- def copy(src_fname, dst_fname):
- src_fobj = open(src_fname, 'rb')
- dst_fobj = open(dst_fname, 'wb')
- while True:
- data = src_fobj.read(4096)
- if not data:
- break
- dst_fobj.write(data)
- src_fobj.close()
- dst_fobj.close()
- copy(sys.argv[1], sys.argv[2])
步骤二:测试脚本执行
- [root@localhost day03]# python3 cp.py
- [root@localhost day03]# cd /root
- [root@localhost ~]# ls
- core ls
- [root@localhost day03]# python3 cp2.py
- [root@localhost day03]# cd /root
- [root@localhost ~]# ls
- core ls
- [root@localhost day03]# python3 cp3.py
- [root@localhost day03]# cd /root
- [root@localhost ~]# ls
- core ls
- [root@localhost day03]# python3 cp_func.py /bin/ls /root/ls
- [root@localhost day03]# cd /root
- [root@localhost ~]# ls
- core ls
创建randpass.py脚本,要求如下:
导入random模块,通过random静态对象调用choice()方法,从自定义字符串all_chs中获取随机项,将获取到的随机字符ch与原result值进行拼接,将最终字符串结果返回给函数,for循环每循环一次获取一个随机字符,密码位数由循环次数决定,循环次数由传递参数值决定。
此程序需要注意的部分在于:
1.导入String模块,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9
2.将整个生成随机密码的代码封装进gen_pass()函数中,当模块文件直接执行时,调用函数即可输出结果
3.参数传递问题:调用函数无实参时,函数调用默认参数,有实参时,函数调用实际参数
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@localhost day03]# vim randpass.py
- #!/usr/bin/env python3
- import random
- import string
- all_chs = string.digits + string.ascii_letters
- def gen_pass(n=8):
- result = ''
- for i in range(n):
- ch = random.choice(all_chs)
- result += ch
- return result
- if __name__ == '__main__':
- print(gen_pass())
- print(gen_pass(4))
或将上面的代码改为以下写法:
利用列表推导式更简洁输出数据
- [root@localhost day03]# vim randpass2.py
- #!/usr/bin/env python3
- from random import choice
- from string import ascii_letters, digits
- all_chs = ascii_letters + digits
- def randpass(n=8):
- result = [choice(all_chs) for i in range(n)]
- return ''.join(result) # 将列表的字符拼接起来
- if __name__ == '__main__':
- print(randpass())
- print(randpass(4))
步骤二:测试脚本执行
- [root@localhost day03]# python3 randpass.py
- 82wi2gOP
- XzMi
- [root@localhost day03]# python3 randpass.py
- 5wMoDEgC
- BDpc
- [root@localhost day03]# python3 randpass.py
- Ige2VGod
- Az0z
- [root@localhost day03]# python3 randpass2.py
- eajAocMH
- edW1