精通Python自动化脚本-运维人员宝典完整目录:
第一章 Python脚本概述
第二章 Python脚本调试和性能测试
第三章 单元测试-单元测试框架的介绍
第四章 自动化常规运维活动
第五章 文件、目录和数据处理
第六章 文件存档、加密和解密
第七章 文本处理和正则表达式
第八章 文档和报告
第九章 操作各类文件
第十章 网络基础 – Socket编程
第十一章 使用Python脚本处理邮件
第十二章 使用Telnet和SSH远程监控主机
第十三章 创建图形化用户界面
第十四章 处理Apache和其它的日志文件
第十五章 SOAP和REST API通讯
第十六章 网络抓取 – 从网站上提取有用的信息
第十七章 数据收集及报表
第十八章 MySQL和SQLite数据库管理
本章中我们将学习使用Python来记录和报告信息。我们会学习如何使用Python脚本来接收输入以及如何打印输出。在Python中编写脚本更为容易。我们将学习如何格式化信息。
本章中,我们将学习如下内容:
- 标准输入和输出
- 信息格式化
- 发送email
标准输入和输出
这一部分,我们将学习Python中的输入和输出。我们会学习stdin和stdout,以及input()函数。
stdin和stdout是类似文件的对象。这些对象由操作系统提供。当用户在交互会话中运行程序时,stdin作为输入,stdout是用户的终端。因为stdin是类似文件的对象,我们要从stdin中读取数据而不是在运行时读取数据。stdout用于输出。它用作表达式和print()函数的输出,以及input()函数的弹出界面。
接下来,我们来看一个stdin和stdout的示例。为此创建一个脚本stdin_stdout_example.py并编写如下内容:
1 2 3 4 5 6 7 8 9 10 |
import sys print("Enter number1: ") a = int(sys.stdin.readline()) print("Enter number2: ") b = int(sys.stdin.readline()) c = a + b sys.stdout.write("Result: %d " %c) |
运行脚本,我们将得到如下输出:
1 2 3 4 5 6 |
$ python3 stdin_stdout_example.py Enter number1: 10 Enter number2: 20 Result: 30 |
在上例中,我们使用了stdin和stdout来接收输入和展示输出。sys.stdin.readline() 会从stdin中进行读取。sys.stdout.write()会写入数据。
下面我们将学习input()和print()函数。input() 函数用于从用户接收输入。该函数有一个可选参数:提示字符串。
语法:input(prompt)
input()函数返回一个字符串值。如果需要数值,仅需在input()之前使用int关键字。可以使用如下方式:
int(input(prompt))
类似地,我们可以书写float来获取浮点值。下面我们来看一个示例。创建一个脚本 input_example.py并编写如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
str1 = input("Enter a string: ") print("Entered string is : ", str1) print() a = int(input("Enter the value of a: ")) b = int(input("Enter the value of b: ")) c = a + b print("Value of c is: ", c) print() num1 = float(input("Enter num 1: ")) num2 = float(input("Enter num 2: ")) num3 = num1/num2 print("Value of num3 is: ", num3) |
运行脚本,将得到如下结果:
1 2 3 4 5 6 7 8 9 10 11 |
$ python3 input_example.py Enter a string: Hello Entered string is : Hello Enter the value of a: 10 Enter the value of b: 20 Value of c is: 30 Enter num 1: 10.5 Enter num 2: 2.0 Value of num3 is: 5.25 |
上例中我们使用了input()函数来处理三个不同值。第一个为字符串,第二个为整数值,第三个浮点值。要对整型和浮点型使用input(),我们需要用int()和float()类型转换函数来将接收到的字符串分别转换为整型和浮点型。
print()函数用于输出数据。我们需要传入一个逗号分隔的一系列参数。在input_example.py中,要得到输出,我们使用print()函数。使用print()函数,我们可以仅通过在数据两边加上 ” ” 或 ‘ ‘来将数据写到屏幕上。如果仅输出值,只需将变量名写到print()函数中。如果想要在同一个print()函数中编写文本同时获取值,那么将两者使用逗号分隔即可。
我们来看一个print()函数的简单示例。创建脚本print_example.py并在其中编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 在屏幕上打印简单字符串 print("Hello Python") # 仅访问值 a = 80 print(a) # 在屏幕上打印字符串并获取值 a = 50 b = 30 c = a/b print("The value of c is: ", c) |
运行脚本,将得到如下输出:
1 2 3 4 |
$ python3 print_example.py Hello Python 80 The value of c is: 1.6666666666666667 |
上例中,首先我们简单地在屏幕上打印了一个字符串。然后我们获取了变量 a 的值并在屏幕上进行了打印。最后,我们输入了 a 和 b 的值,进行想加并存储在变量 c 中,然后打印了一个语句并在同一个print()函数访问了变量值。
信息格式化
这部分中,我们将学习字符串的格式化。我们将学习格式化信息的两种方式:一种是使用string format()方法,另一种通过使用 %运算符。
首先,我们会学习使用字符串的format()方法来格式化字符串。字符串类的该方法让我们可以对值进行格式化。它也可以让我们进行变量替换。这将通过位置参数来合并元素。
下面我们将学习如何使用格式化器来进行这一格式化。调用该方法的字符串可以包含纯文本或以大括号{}分隔的替换字段。对同一字符串进行格式化时可以使用多组 {}。这一替换字段可包含参数的索引或参数的名称。运行之后,我们将得到一个以参数字符串值对字段进行替换后的字符串的拷贝。
下面我们就来看一个字符串格式化的示例。
创建一个脚本format_example.py并编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 |
# Using single formatter print("{}, My name is John".format("Hi")) str1 = "This is John. I am learning {} scripting language." print(str1.format("Python")) print("Hi, My name is Sara and I am {} years old!!".format(26)) # Using multiple formatters str2 = "This is Mary {}. I wark at {} Resource department. I am {} years old!!" print(str2.format("Jacobs", "Human", 30)) print("Hello {}, Nice to meet you. I am {}.".format("Emily", "Jennifer")) |
运行脚本如下:
1 2 3 4 5 6 |
$ python3 format_example.py Hi, My name is John This is John. I am learning Python scripting language. Hi, My name is Sara and I am 26 years old!! This is Mary Jacobs. I wark at Human Resource department. I am 30 years old!! Hello Emily, Nice to meet you. I am Jennifer. |
上例中,我们使用了字符串类的format() 方法并通过一个和多个格式化器进行了字符串格式化。
下面,我们将学习使用%运算符来进行字符串格式化。与%运算符一同使用的还有一些格式化符号。以下是常用的一些符号:
- %d: 数字整型
- %s: 字符串
- %f: 浮点数
- %c: 字符
我们来看一个示例。创建一个脚本string_formatting.py并编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# Basic formatting a = 10 b = 20 print("The values of a and b are %d %d" % (a, b)) c = a + b print("The value of c is %d" % c) str1 = "John" print("My name is %s" % str1) x = 10.5 y = 33.5 z = x * y print("The value of z is %f" % z) print() # aligning name = "Mary" print("Normal: Hello, I am %s !!" % name) print("Right aligned: Hello, I am %10s !!" % name) print("Left aligned: Hello, I am %-10s !!" % name) print() # truncating print("The truncated string is %.4s" % ("Examination")) print() # formatting placeholders students = {'Name' : 'John', 'Address' : 'New York'} print("Student details: Name:%(Name)s Address:%(Address)s" % students) |
运行脚本,将得到如下结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ python3 string_formatting.py The values of a and b are 10 20 The value of c is 30 My name is John The value of z is 351.750000 The values of a and b are 10 20 The value of c is 30 My name is John The value of z is 351.750000 Normal: Hello, I am Mary !! Right aligned: Hello, I am Mary !! Left aligned: Hello, I am Mary !! The truncated string is Exam Student details: Name:John Address:New York |
上例中,我们使用了%运算符来格式化字符串:%d为数字,%s为字符串,%f 为浮点数。然后,我们对字符串进行了向左和向右对齐。我们还学习了如何使用%运算符截取字符串。%.4s仅显示前4个字符。然后我们创建了一个名为students的字典,并输入了Name和Address键值对。最后,我们在%运算符之后放置键名来获取这些字符串。
发送email
这一部分中,我们将学习通过Python脚本来从Gmail发送邮件。Python带有一个名为smtplib的模块实现这一功能。Python中的smtplib模块提供了SMTP客户端会话对象,用于使用SMTP监听器向互联网上的任意机器发送邮件。
我们来看一个示例。本例中,我们将从Gmail向收件人发送一封包含简单文本的email。
创建一个send_email.py脚本并编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import smtplib from email.mime.text import MIMEText import getpass host_name = 'smtp.gmail.com' # host_name = 'smtp.exmail.qq.com' # 腾讯企业邮箱 # host_name = 'smtp.qq.com' # QQ 邮箱 port = 465 u_name = 'username/emailid' # 请自行修改 password = getpass.getpass() sender = '发送者姓名' receivers = ['receiver1_email_address', 'receiver2_email_address'] # 请自行修改 text = MIMEText('Test mail') text['Subject'] = 'Test' text['From'] = sender text['To'] = ', '.join(receivers) s_obj = smtplib.SMTP_SSL(host_name, port) s_obj.login(u_name, password) s_obj.sendmail(u_name, receivers, text.as_string()) s_obj.quit() print("Mail sent successully") |
译者注:测试时Gmail和 QQ 邮箱报错:smtplib.SMTPAuthenticationError,应为验证机制所致,腾讯企业邮箱正常
运行脚本如下
1 2 3 4 5 |
$ python3 send_email.py # 输出结果 Password: Mail sent successully |
上例中,我们通过Gmail ID来向收件人发送邮件。变量u_name会存储你的email ID。对password变量,你可以直接使用密码赋值,也可以使用getpass模块来接收密码输入。这里我们提示输入密码。变量sender中可传入你的姓名。接着我们添加了邮件发送的多个接收人。然后,我们传入了标题、发件人和邮件的接收者。接着我们在login()中放入了u_name和password变量。再后在sendmail()中,我们传入了发件人、收件人和变量text。那么使用这个流程我们成功的发送了邮件。
下面我们再来看一个示例,发送一个带附件的邮件。本例中,我们将向接收人发送一张图片。我们将通过Gmail来发送这一邮件。创建一个脚本send_email_attachment.py并编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import os import smtplib from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart import getpass host_name = 'smtp.gmail.com' # host_name = 'smtp.exmail.qq.com' # 腾讯企业邮箱 # host_name = 'smtp.qq.com' # QQ 邮箱 port = 465 u_name = 'username/emailid' # 请自行修改 password = getpass.getpass() sender = '发送者姓名' receivers = ['receiver1_email_address', 'receiver2_email_address'] # 请自行修改 text = MIMEMultipart() text['Subject'] = 'Test Attachment' text['From'] = sender text['To'] = ', '.join(receivers) txt = MIMEText('sending a sample image.') text.attach(txt) f_path = '/home/student/Desktop/mountain.jpg' with open(f_path, 'rb') as f: img = MIMEImage(f.read()) img.add_header('Content-Disposition', 'attachment', filename=os.path.basename(f_path)) text.attach(img) server = smtplib.SMTP_SSL(host_name, port) server.login(u_name, password) server.sendmail(u_name, receivers, text.as_string()) print("Email with attachment sent successfully !!") server.quit() |
运行脚本如下:
1 2 3 4 5 |
$ python3 send_email_attachment.py # 输出 Password: Email with attachment sent successfully !! |
上例中,我们向接收人发送了一张带有图片附件的邮件。我们传入了发送人和接收人的email ID。然后,为f_path赋值了作为附件发送的图片的路径。再后我们向接收人发送了以该图片为附件的邮件。
ℹ️在前面的两个例子中 – send_text.py和send_email_attachment.py – 我们通过 Gmail 发送了邮件。你可以使用任意其它的邮件提供商进行发送。要使用其它的邮件提供商,只需为host_name传入提供商的名称。当然别忘了在前面加上 smtp。在这些示例中,我们使用了smtp.gmail.com,而如果是Yahoo!,你可以使用smtp.mail.yahoo.com。因此可根据邮件提供商的不同来提供对应的主机名和端口。
总结
本章中,我们学习了标准输入和输出。我们学习了stdin和stdout如何分别进行键盘输入和用户终端输出。我们还学习了input()和print()函数。此外,我们学习了从Gmail向接收人发送邮件。我们使用普通文本以及附件分别发送了邮件。同时我们学习了使用format()方法和%运算符进行字符串格式化。
下一章中,我们会学习如何处理不同文件,如PDF, Excel和csv。
课后问题
- stdin和输入的区别是什么?
- SMTP是什么?
- 以下代码的输出是什么?
12345678910>>> name = "Eric">>> profession = "comedian">>> affiliation = "Monty Python">>> age = 25>>> message = (... f"Hi {name}. "... f"You are a {profession}. "... f"You were in {affiliation}."... )>>> message - 以下代码的输出是什么?
1234str1 = 'Hello'str2 = 'World!'print('str1 + str2 = ', str1 + str2)print('str1 * 3 =', str1 * 3)
扩展阅读
- 字符串文档:https://docs.python.org/3.1/library/string.html
- smptplib文档: https://docs.python.org/3/library/smtplib.html