一、用Python写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径
#!/usr/bin/env python
import os
# 遍历/tmp目录及其子目录
for root, dirs, files in os.walk('/tmp'):
# 遍历当前目录下的所有文件
for name in files:
# 打印文件的完整路径
print(os.path.join(root, name))
os.walk()
原型为:os.walk(top, topdown=True, οnerrοr=None, followlinks=False)
我们一般只使用第一个参数。(topdown指明遍历的顺序)
os.walk('/tmp')会生成/tmp目录下所有文件和目录的路径- 对于每个目录,它返回一个三元组
(root, dirs, files)root是当前正在遍历的目录的路径dirs是当前目录下的所有子目录的列表files是当前目录下的所有文件的列表
os.path.join(root, name)用于将目录路径和文件名拼接成完整的文件路径
二、写程序打印三角形
普通三角形
#!/usr/bin/env python
# 使用Python 3的input函数并转换为整数
num = int(input('input number:'))
for i in range(1, num + 1):
# 打印一行i个星号
for j in range(i):
print('*', end='') # 不换行
print() # 每行结束后换行
等腰三角形:
#!/usr/bin/env python
# 获取用户输入的行数
rows = int(input('请输入等腰三角形的行数: '))
# 打印等腰三角形
for i in range(1, rows + 1):
# 打印左侧空格
for j in range(rows - i):
print(' ', end='')
# 打印星号
for k in range(2 * i - 1):
print('*', end='')
# 换行
print()
三、生成磁盘使用情况的日志文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import os
# 获取当前日期作为文件名
new_time = time.strftime('%Y-%m-%d')
log_filename = f"{new_time}.log"
# 获取磁盘状态信息
disk_status = os.popen('df -h').readlines()
str1 = ''.join(disk_status)
# 使用with语句操作文件,更安全且自动处理关闭
with open(log_filename, 'w', encoding='utf-8') as f:
f.write(str1)
# with语句会自动处理刷新和关闭,不需要显式调用flush()和close()
四、统计出每个IP的访问量有多少?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 不建议使用list作为变量名,因为它是Python的内置类型
ip_list = []
# 使用with语句更安全地处理文件操作
with open('/tmp/1.log', 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
# 处理空行,避免索引错误
if line.strip():
ip = line.split()[0]
ip_list.append(ip)
# 使用集合获取唯一IP
unique_ips = set(ip_list)
for ip in unique_ips:
count = ip_list.count(ip)
# 使用Python 3的print函数格式
print(f"{ip} : {count}")
五、生成随机密码
# 调用随机数模块random
# string模块中的变量ascii_letters和digits中,定义了大小写字母和所有数字
import random
from string import ascii_letters, digits
# 定义变量all_chs,存储密码的所有选择;
all_chs = ascii_letters + digits
# 使用def定义函数randpass(), 生成随机8位密码
def randpass(n=8):
result = ''
for i in range(n):
ch = random.choice(all_chs)
result += ch
return result # return给函数返回密码
# 测试代码块,__name__作为python文件调用时,执行代码块
if __name__ == '__main__':
print(randpass(8))
print(randpass(4))
六、比较文件内容
需求:
有两个文件:a.log 和 b.log
两个文件中有大量重复内容
取出只有在 b.log 中存在的行
# 定义变量,指定要操作的文件路径
fname1 = '/opt/a.log'
fname2 = '/opt/b.log'
# 将对象fobj1转换为集合类型(集合中的元素无序排列,且不会重复)
with open(fname1, mode="r") as fobj1:
aset = set(fobj1.readlines())
# 将对象fobj2转换为集合类型(集合中的元素无序排列,且不会重复)
with open(fname2, mode="r") as fobj2:
bset = set(fobj2.readlines())
print(bset - aset)
七、paramiko 实例(远程执行命令)
需求:
• 创建 SSHClient 实例
• 设置添加主机密钥策略
• 连接 ssh 服务器
• 执行指定命令
import paramiko
def rcmd(host, username, password, commands):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
ssh.connect(host,
username=username, password=password)
data = ssh.exec_command(commands)
# data[1]: 存储的是命令执行成功的输出信息
# data[2]: 存储的是命令执行失败的错误信息
log = data[1].read()
err = data[2].read()
if len(log) != 0:
print("log:", log.decode(), end="")
if len(err) != 0:
print("err:", err.decode(), end="")
ssh.close()
if __name__ == '__main__':
ip = input("请输入您要操作的远程主机ip: ")
username = input(f"请输入ip为:{ip}, 登录的用户名: ")
password = input(f"请输入 {username} 对应的密码: ")
cmds = input("请输入要执行的命令: ")
rcmd(ip, username, password, cmds)
八、多线程编程
- subprocess.run() 方法可以调用系统命令,其返回值是系统命令退出码,也就是如果系统
命令成功执行,返回0,如果没有成功执行,返回非零值
import subprocess
import threading
def ping(host):
result = subprocess.run(
'ping -c2 %s &> /dev/null' % host,
shell=True
)
if result.returncode == 0:
print('%s: up' % host)
else:
print('%s: down' % host)
if __name__ == '__main__':
ips = ['172.40.58.%s' % i for i in range(1, 255)]
for ip in ips:
# 创建线程,ping是上面定义的函数, args是传给ping函数的参数
t = threading.Thread(target=ping, args=(ip,))
t.start() # 执行ping(ip)

736

被折叠的 条评论
为什么被折叠?



