文档和报告

第八章 文档和报告

本章中我们将学习使用Python来记录和报告信息。我们会学习如何使用Python脚本来接收输入以及如何打印输出。在Python中编写脚本更为容易。我们将学习如何格式化信息。

本章中,我们将学习如下内容:

  • 标准输入和输出
  • 信息格式化
  • 发送email

标准输入和输出

这一部分,我们将学习Python中的输入和输出。我们会学习stdin和stdout,以及input()函数。

stdin和stdout是类似文件的对象。这些对象由操作系统提供。当用户在交互会话中运行程序时,stdin作为输入,stdout是用户的终端。因为stdin是类似文件的对象,我们要从stdin中读取数据而不是在运行时读取数据。stdout用于输出。它用作表达式和print()函数的输出,以及input()函数的弹出界面。

接下来,我们来看一个stdin和stdout的示例。为此创建一个脚本stdin_stdout_example.py并编写如下内容:

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)

运行脚本,我们将得到如下输出:

$ 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并编写如下代码:

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)

运行脚本,将得到如下结果:

$ 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并在其中编写如下内容:

# 在屏幕上打印简单字符串
print("Hello Python")

# 仅访问值
a = 80
print(a)

# 在屏幕上打印字符串并获取值
a = 50
b = 30
c = a/b
print("The value of c is: ", c)

运行脚本,将得到如下输出:

$ 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并编写如下内容:

# 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"))

运行脚本如下:

$ 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并编写如下内容:

# 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)

运行脚本,将得到如下结果:

$ 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脚本并编写如下内容:

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,应为验证机制所致,腾讯企业邮箱正常

运行脚本如下

$ 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并编写如下内容:

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()

运行脚本如下:

$ 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。

课后问题

  1. stdin和输入的区别是什么?

  2. SMTP是什么?

  3. 以下代码的输出是什么?

>>> name = "Eric"
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> age = 25
>>> message = (
... 	f"Hi {name}. "
... 	f"You are a {profession}. "
... 	f"You were in {affiliation}."
... )
>>> message
  1. 以下代码的输出是什么?
str1 = 'Hello'
str2 = 'World!'
print('str1 + str2 = ', str1 + str2)
print('str1 * 3 =', str1 * 3)

扩展阅读

  1. 字符串文档:https://docs.python.org/3.1/library/string.html
  2. smptplib文档: https://docs.python.org/3/library/smtplib.html
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值