编写mktxtfile.py脚本,实现以下目标:
用三个函数分别实现文件名获取、文件内容获取、将获取到的文件内容写入get_fname()函数获取的文件中 这三个方法,最终调用三个函数,完成文件创建:
1.获取文件名函数get_fname():利用while语句循环判断文件名是否存在,input文件名,如果不存在,循环停止,返回用户输入的文件名,如果存在,提示已存在,重新进入循环,直至文件名不存在为止,返回文件名用户输入的文件名
2.文件内容获取函数get_contents():创建空列表存储获取到的数据,利用while语句让用户循环输入数据,如果输入的数据是end,循环停止,返回列表中内容,如果输入的数据不是end,将输入的数据追加到列表结尾,返回列表中内容
3.wfile()函数:用with语句将获取到的文件以写方式打开,这样打开代码块结束后文件会自动关闭,将get_contents()函数返回内容写入到已打开文件中
4.最终当用户cat文件名时,可以看到写入结果
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
- [root@localhost day04]# vim mktxtfile.py
- #!/usr/bin/env python3
- import os
- def get_fname():
- while True:
- filename = input('请输入文件名:')
- if not os.path.exists(filename):
- break
- print('%s 已存在,请重试。' % filename)
- return filename
- def get_contents():
- contents = []
- print('请输入内容,结束请输入end。')
- while True:
- line = input('> ')
- if line == 'end':
- break
- contents.append(line)
- return contents
- def wfile(fname, contents):
- with open(fname, 'w') as fobj:
- fobj.writelines(contents)
- if __name__ == '__main__':
- fname = get_fname()
- contents = get_contents()
- contents = ['%s\n' % line for line in contents]
- wfile(fname, contents)
步骤二:测试脚本执行
- [root@localhost day04]# ls
- adduser.py format_str2.py list_method.py mylist.py string_op.py
- checkid.py format_str.py mkseq.py randpass2.py
- fmtoutput.py get_val.py mktxtfile.py seq_func.py
- [root@localhost day04]# python3 mktxtfile.py
- 请输入文件名:passwd
- 请输入内容,结束请输入end。
- > nihao,welcom
- > woshi
- > end
- [root@localhost day04]# python3 mktxtfile.py
- 请输入文件名:mkseq.py
- mkseq.py 已存在,请重试。
- 请输入文件名:randpass.py
- 请输入内容,结束请输入end。
- > myname
- > end
- [root@localhost day04]# cat passwd
- nihao,welcom
- woshi
- [root@localhost day04]# cat randpass.py
- myname
- [root@localhost day04]# ls
- adduser.py format_str2.py list_method.py mylist.py randpass.py
- checkid.py format_str.py mkseq.py passwd seq_func.py
- fmtoutput.py get_val.py mktxtfile.py randpass2.py string_op.py
创建adduser.py文件,实现以下目标:
创建add_user()函数,让函数具有创建用户、创建密码、将用户密码写入到指定文件三种方法,因此为函数设置3个参数,分别是用户名、密码及用户名密码存放文件,最终通过函数调用上传实参的方式,完成用户创建
1.利用subprocess.call函数运行用户创建命令
2.subprocess.call函数运行密码设置命令
3.用with语句将指定的文件以追加模式打开,这样打开代码块结束后文件会自动关闭,将用户密码用指定格式写入指定文件
4.调用add_user()函数时上传的用户名实参,是利用sys.argv[]参数,在命令行调用的时候由系统传递给程序,这个变量其实是一个List列表,用于保存命令行上的参数,argv[0] 一般是“被调用的脚本文件名或全路径”,argv[1]和以后就是传入的系统命令参数
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
将randpass文件的代码以模块形式导入以下代码中,直接调用gen_pass()函数获取返回值(即获取随机生成的密码):
- [root@localhost day04] # vim adduser.py
- #!/usr/bin/env python3
- import sys
- import subprocess
- from randpass import gen_pass
- def add_user(username, password, fname):
- info = """user information:
- username: %s
- password: %s
- """
- subprocess.run('useradd %s' % username, shell=True)
- subprocess.run(
- 'echo %s | passwd --stdin %s' % (password, username),
- shell=True
- )
- with open(fname, 'a') as fobj:
- fobj.write(info % (username, password))
- if __name__ == '__main__':
- username = sys.argv[1]
- password = gen_pass()
- fname = '/tmp/users.txt'
- add_user(username, password, fname)
步骤二:测试脚本执行
- [root@localhost day04]# python3 adduser.py b c d
- 更改用户 b 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- [root@localhost day04]# python3 adduser.py a c d
- useradd:用户“a”已存在
- 更改用户 a 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- [root@localhost day04]# cat /tmp/users.txt
- user information:
- username: a
- password: hD31SmTS
- user information:
- username: b
- password: DztS7ycn
- user information:
- username: a
- password: f2iH0Znt
创建fmtoutput.py脚本,要求如下:
图-1
利用for循环方式遍历获取到的用户输入数据列表,将用户输入的每一条数据依次遍历出来
通过format()方法,把遍历得到的字符串当作一个模版,通过传入的参数进行格式化。这个用来格式化的模版使用大括号({,})作为特殊字符,其中^代表居中对齐、48代表宽度。
实现此案例需要按照如下步骤进行。
步骤一:编写脚本
将mktxtfile文件的代码以模块形式导入以下代码中,直接调用get_contents ()函数获取返回值(即获取用户输入数据列表):
- [root@localhost day04]# vim fmtoutput.py
- #!/usr/bin/env python3
- from mktxtfile import get_contents
- width = 48
- contents = get_contents()
- print('+%s+' % ('*' * 48))
- for line in contents:
- print('+{:^48}+'.format(line))
- print('+%s+' % ('*' * 48))
步骤二:测试脚本执行
- [root@localhost day04]# python3 fmtoutput.py
- 请输入内容,结束请输入end。
- > nihao
- > my name zhangzhigang
- > bye
- > end
- +************************************************+
- + nihao +
- + my name zhangzhigang +
- + bye +
- +************************************************+