Python网络编程与数据处理全解析
1. 网络浏览器操作
1.1 webbrowser模块概述
webbrowser模块提供了以平台无关的方式在网络浏览器中打开文档的实用功能,主要用于开发和测试场景。例如,若编写了一个生成HTML输出的脚本,可使用该模块的函数自动引导系统浏览器查看结果。
1.2 主要函数及用法
| 函数名 | 描述 |
|---|---|
open(url [, new [, autoraise]])
|
使用系统默认浏览器显示URL。
new
为0时,尽可能在运行的浏览器同一窗口打开;为1时,创建新的浏览器窗口;为2时,在浏览器新标签页打开。
autoraise
为True时,会将浏览器窗口置于前端。
|
open_new(url)
|
在默认浏览器的新窗口中显示URL,等同于
open(url, 1)
。
|
open_new_tab(url)
|
在默认浏览器的新标签页中显示URL,等同于
open(url, 2)
。
|
get([name])
|
返回一个用于操作浏览器的控制器对象。
name
是浏览器类型的名称,如
'netscape'
、
'mozilla'
等。若省略
name
,则返回默认浏览器的控制器对象。
|
register(name, constructor[, controller])
|
注册一个新的浏览器类型供
get()
函数使用。
name
是浏览器名称,
constructor
用于创建控制器对象,若提供了
controller
实例,则忽略
constructor
。
|
1.3 控制器对象方法
控制器对象
c
(由
get()
函数返回)具有以下方法:
-
c.open(url[, new])
:与
open()
函数功能相同。
-
c.open_new(url)
:与
open_new()
函数功能相同。
2. 互联网数据处理与编码
2.1 base64模块
2.1.1 编码原理
Base 64编码将待编码的数据分组为24位(3字节)的组,每个24位组再细分为四个6位组件,每个6位值用以下字母表中的可打印ASCII字符表示:
| 值范围 | 编码字符 |
| — | — |
| 0 - 25 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| 26 - 51 | abcdefghijklmnopqrstuvwxyz |
| 52 - 61 | 0123456789 |
| 62 | + |
| 63 | / |
| 填充 | = |
若输入流中的字节数不是3的倍数,数据会被填充以形成完整的24位组,额外的填充用
=
字符表示。
2.1.2 主要函数
| 函数名 | 描述 |
|---|---|
b64encode(s [, altchars])
|
使用Base 64编码对字节字符串
s
进行编码。
altchars
是一个双字符字符串,用于指定替代
+
和
/
的字符。
|
b64decode(s [, altchars])
|
解码Base 64编码的字符串
s
,返回解码后的字节字符串。若输入包含无关字符或填充不正确,会引发
TypeError
。
|
standard_b64encode(s)
|
使用标准Base 64编码对字节字符串
s
进行编码。
|
standard_b64decode(s)
|
使用标准Base 64编码解码字符串
s
。
|
urlsafe_b64encode(s)
|
使用Base 64编码对字节字符串
s
进行编码,但使用
-
和
_
分别替代
+
和
/
。
|
urlsafe_b64decode(s)
|
解码使用URL安全的Base 64编码的字符串
s
。
|
b32encode(s)
|
使用Base 32编码对字节字符串
s
进行编码。
|
b32decode(s [, casefold [, map01]])
|
使用Base 32编码解码字符串
s
。
casefold
为True时,大小写字母都接受;
map01
指定数字1映射的字母。
|
b16encode(s)
|
使用Base 16(十六进制)编码对字节字符串
s
进行编码。
|
b16decode(s [,casefold])
|
使用Base 16(十六进制)编码解码字符串
s
。
casefold
为True时,字母大小写均可。
|
2.2 binascii模块
binascii模块包含用于在二进制和各种ASCII编码(如Base 64、BinHex和UU编码)之间转换数据的低级函数。
| 函数名 | 描述 |
| — | — |
|
a2b_uu(s)
| 将一行UU编码的文本
s
转换为二进制并返回字节字符串。 |
|
b2a_uu(data)
| 将二进制数据字符串转换为一行UU编码的ASCII字符。数据长度不应超过45字节。 |
|
a2b_base64(string)
| 将Base 64编码的文本字符串转换为二进制并返回字节字符串。 |
|
b2a_base64(data)
| 将二进制数据字符串转换为一行Base 64编码的ASCII字符。若结果要通过电子邮件传输,数据长度不应超过57字节。 |
|
a2b_hex(string)
| 将十六进制数字字符串转换为二进制数据,也称为
unhexlify(string)
。 |
|
b2a_hex(data)
| 将二进制数据字符串转换为十六进制编码,也称为
hexlify(data)
。 |
|
a2b_hqx(string)
| 将BinHex 4编码的数据字符串转换为二进制,不进行RLE(游程编码)解压缩。 |
|
rledecode_hqx(data)
| 对二进制数据进行RLE解压缩。若数据输入不完整,会引发
Incomplete
异常。 |
|
rlecode_hqx(data)
| 对数据进行BinHex 4 RLE压缩。 |
|
b2a_hqx(data)
| 将二进制数据转换为BinHex 4编码的ASCII字符字符串。数据应已进行RLE编码,且除非是最后一个数据片段,数据长度应能被3整除。 |
|
crc_hqx(data, crc)
| 计算字节字符串
data
的BinHex 4 CRC校验和。
crc
是校验和的起始值。 |
|
crc32(data [, crc])
| 计算字节字符串
data
的CRC - 32校验和。
crc
是可选的初始CRC值,默认为0。 |
2.3 csv模块
2.3.1 概述
csv模块用于读写由逗号分隔值(CSV)组成的文件。CSV文件由文本行组成,每行由分隔符(通常是逗号或制表符)分隔的值组成。
2.3.2 主要函数及用法
| 函数名 | 描述 |
|---|---|
reader(csvfile [, dialect [, **fmtparams]])
|
返回一个读取器对象,用于生成输入文件
csvfile
每行的输入值。
dialect
参数用于处理不同的CSV编码差异,内置方言有
'excel'
和
'excel-tab'
。
fmtparams
是一组关键字参数,用于自定义方言的各个方面。
|
writer(csvfile [, dialect [, **fmtparam]])
|
返回一个写入器对象,用于创建CSV文件。
dialect
和
fmtparams
的含义与
reader()
相同,此外还有一个额外的关键字参数
quoting
,用于控制输出数据的引用行为。
|
DictReader(csvfile [, fieldnames [, restkey [, restval [, dialect [, **fmtparams]]]]])
| 返回一个读取器对象,操作方式与普通读取器类似,但读取文件时返回字典对象。 |
DictWriter(csvfile, fieldnames [, restval [, extrasaction [, dialect [, **fmtparams]]]])
| 返回一个写入器对象,操作方式与普通写入器类似,但将字典写入输出行。 |
Sniffer()
|
创建一个
Sniffer
对象,用于尝试自动检测CSV文件的格式。
|
2.3.3 方言管理
CSV模块中的许多函数和方法涉及特殊的方言参数,用于适应不同的CSV文件格式。可以使用以下实用函数管理方言:
-
register_dialect(name, dialect)
:注册一个新的
Dialect
对象。
-
unregister_dislect(name)
:移除指定名称的
Dialect
对象。
-
get_dialect(name)
:返回指定名称的
Dialect
对象。
-
list_dialects()
:返回所有已注册方言名称的列表。
2.3.4 示例代码
import csv
# 读取基本CSV文件
f = open("scmods.csv", "r")
for r in csv.reader(f):
lastname, firstname, street, city, zip = r
print("{0} {1} {2} {3} {4}".format(*r))
# 使用DictReader
f = open("address.csv")
r = csv.DictReader(f, ['lastname', 'firstname', 'street', 'city', 'zip'])
for a in r:
print("{firstname} {lastname} {street} {city} {zip}".format(**a))
# 写入基本CSV文件
data = [
['Blues', 'Elwood', '1060 W Addison', 'Chicago', 'IL', '60613'],
['McGurn', 'Jack', '4802 N Broadway', 'Chicago', 'IL', '60640']
]
f = open("address.csv", "w")
w = csv.writer(f)
w.writerows(data)
f.close()
3. 电子邮件处理
3.1 解析电子邮件
3.1.1 解析函数
在顶层,
email
模块提供了两个用于解析邮件的函数:
-
message_from_file(f)
:从文件对象
f
中读取并解析电子邮件消息,返回一个
Message
实例。
-
message_from_string(str)
:从文本字符串
str
中读取并解析电子邮件消息,返回一个
Message
实例。
3.1.2 Message实例操作
Message
实例
m
模拟字典,支持以下操作:
| 操作 | 描述 |
| — | — |
|
m[name]
| 返回指定名称的邮件头的值。 |
|
m.keys()
| 返回所有邮件头名称的列表。 |
|
m.values()
| 返回邮件头值的列表。 |
|
m.items()
| 返回包含邮件头名称和值的元组列表。 |
|
m.get(name [,def])
| 返回指定名称的邮件头的值,若未找到则返回默认值
def
。 |
|
len(m)
| 返回邮件头的数量。 |
|
str(m)
| 将邮件转换为字符串,等同于
as_string()
方法。 |
|
name in m
| 若
name
是邮件头的名称,则返回True。 |
3.1.3 提取信息方法
m
还有以下方法用于提取信息:
| 方法名 | 描述 |
| — | — |
|
m.get_all(name [, default])
| 返回指定名称邮件头的所有值的列表,若不存在则返回默认值。 |
|
m.get_boundary([default])
| 返回
'Content-type'
邮件头中的边界参数,若未找到则返回默认值。 |
|
m.get_charset()
| 返回与邮件有效负载关联的字符集。 |
|
m.get_charsets([default])
| 返回邮件中出现的所有字符集的列表。 |
|
m.get_content_charset([default])
| 返回邮件中第一个
'Content-type'
邮件头的字符集,若未找到则返回默认值。 |
|
m.get_content_maintype()
| 返回主要内容类型。 |
|
m.get_content_subtype()
| 返回子内容类型。 |
|
m.get_content_type()
| 返回包含邮件内容类型的字符串。 |
|
m.get_default_type()
| 返回默认内容类型。 |
|
m.get_filename([default])
| 返回
'Content-Disposition'
邮件头中的文件名参数,若未找到则返回默认值。 |
|
m.get_param(param [, default [, header [, unquote]]])
| 返回指定邮件头参数的值。 |
|
m.get_params([default [, header [, unquote]]])
| 返回指定邮件头的所有参数的列表。 |
|
m.get_payload([i [, decode]])
| 返回邮件的有效负载。若为简单邮件,返回包含邮件正文的字节字符串;若为多部分邮件,返回包含所有子部分的列表。 |
|
m.get_unixfrom()
| 返回UNIX风格的
'From ...'
行,若存在。 |
|
m.is_multipart()
| 若
m
是多部分邮件,则返回True。 |
|
m.walk()
| 创建一个生成器,用于遍历邮件的所有子部分。 |
3.1.4 示例代码
import email
import sys
f = open(sys.argv[1], "r") # 打开邮件文件
m = email.message_from_file(f) # 解析邮件
# 打印发件人/收件人的简短摘要
print("From : %s" % m["from"])
print("To : %s" % m["to"])
print("Subject : %s" % m["subject"])
print("")
if not m.is_multipart():
# 简单邮件。直接打印有效负载
payload = m.get_payload(decode=True)
charset = m.get_content_charset('iso-8859-1')
print(payload.decode(charset))
else:
# 多部分邮件。遍历所有子部分
for s in m.walk():
filename = s.get_filename()
if filename:
print("Saving attachment: %s" % filename)
data = s.get_payload(decode=True)
open(filename, "wb").write(data)
else:
if s.get_content_type() == 'text/plain':
payload = s.get_payload(decode=True)
charset = s.get_content_charset('iso-8859-1')
print(payload.decode(charset))
3.2 编写电子邮件
3.2.1 创建邮件对象
可以创建一个空的
Message
对象,或使用通过解析电子邮件消息创建的
Message
对象。
Message()
函数用于创建一个初始为空的新邮件。
3.2.2 填充邮件内容
Message
实例
m
支持以下方法用于填充邮件内容、邮件头和其他信息:
| 方法名 | 描述 |
| — | — |
|
m.add_header(name, value, **params)
| 添加一个新的邮件头。 |
|
m.as_string([unixfrom])
| 将整个邮件转换为字符串。
unixfrom
为True时,会在第一行显示UNIX风格的
'From ...'
行。 |
|
m.attach(payload)
| 向多部分邮件添加附件。 |
|
m.del_param(param [, header [, requote]])
| 删除指定邮件头中的参数。 |
|
m.replace_header(name, value)
| 替换指定名称的第一个邮件头的值。 |
|
m.set_boundary(boundary)
| 设置邮件的边界参数。 |
|
m.set_charset(charset)
| 设置邮件使用的默认字符集。 |
|
m.set_default_type(ctype)
| 设置邮件的默认内容类型。 |
|
m.set_param(param, value [, header [, requote [, charset [, language]]]])
| 设置邮件头参数的值。 |
|
m.set_payload(payload [, charset])
| 设置邮件的整个有效负载。 |
|
m.set_type(type [, header [, requote]])
| 设置
'Content-type'
邮件头中使用的类型。 |
|
m.set_unixfrom(unixfrom)
| 设置UNIX风格的
'From ...'
行的文本。 |
3.2.3 预建消息对象
除了创建原始的
Message
对象,还有一组对应不同内容类型的预建消息对象,用于创建多部分MIME邮件:
| 对象名 | 描述 |
| — | — |
|
MIMEApplication(data [, subtype [, encoder [, **params]]])
| 创建包含应用程序数据的邮件。 |
|
MIMEAudio(data [, subtype [, encoder [, **params]]])
| 创建包含音频数据的邮件。 |
|
MIMEImage(data [, subtype [, encoder [, **params]]])
| 创建包含图像数据的邮件。 |
|
MIMEMessage(msg [, subtype])
| 创建一个新的非多部分MIME邮件。 |
|
MIMEMultipart([subtype [, boundary [, subparts [, **params]]]])
| 创建一个新的MIME多部分邮件。 |
|
MIMEText(data [, subtype [, charset]])
| 创建包含文本数据的邮件。 |
3.2.4 示例代码
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.audio import MIMEAudio
sender = "jon@nogodiggydie.net"
receiver = "dave@dabeaz.com"
subject = "Faders up!"
body = "I never should have moved out of Texas. -J.\n"
audio = "TexasFuneral.mp3"
m = MIMEMultipart()
m["to"] = receiver
m["from"] = sender
m["subject"] = subject
m.attach(MIMEText(body))
apart = MIMEAudio(open(audio, "rb").read(), "mpeg")
apart.add_header("Content-Disposition", "attachment", filename=audio)
m.attach(apart)
# 发送电子邮件消息
s = smtplib.SMTP()
s.connect()
s.sendmail(sender, [receiver], m.as_string())
s.close()
综上所述,Python提供了丰富的模块和功能,用于网络浏览器操作、互联网数据处理与编码以及电子邮件处理。通过合理使用这些模块和函数,可以高效地完成各种相关任务。同时,需要注意一些高级定制和配置选项,可查阅在线文档获取更多信息。对于使用旧代码的情况,基本概念仍然适用,但可能需要调整类和子模块的位置。
4. 综合应用示例
4.1 网络爬虫数据处理
假设我们要编写一个简单的网络爬虫,爬取网页内容并对其进行编码处理。以下是一个示例代码:
import requests
import base64
import csv
# 爬取网页内容
url = 'https://example.com'
response = requests.get(url)
html_content = response.content
# 对内容进行Base64编码
encoded_content = base64.b64encode(html_content)
# 将编码后的数据保存到CSV文件
with open('encoded_data.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['Encoded Content'])
writer.writerow([encoded_content.decode('utf-8')])
这个示例展示了如何结合网络请求、数据编码和CSV文件写入的操作。具体步骤如下:
1. 使用
requests
库发送HTTP请求,获取网页内容。
2. 使用
base64
模块对网页内容进行Base64编码。
3. 使用
csv
模块将编码后的数据保存到CSV文件中。
4.2 邮件自动发送与数据附加
在实际应用中,我们可能需要定期发送包含特定数据的邮件。以下是一个示例代码:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import csv
import base64
# 读取CSV文件内容
csv_data = []
with open('data.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
csv_data.append(row)
# 对CSV数据进行Base64编码
encoded_csv = base64.b64encode('\n'.join([','.join(row) for row in csv_data]).encode('utf-8'))
# 创建邮件对象
sender = "sender@example.com"
receiver = "receiver@example.com"
subject = "Data Report"
body = "Please find the attached data report."
m = MIMEMultipart()
m["to"] = receiver
m["from"] = sender
m["subject"] = subject
m.attach(MIMEText(body))
# 添加附件
attachment = MIMEApplication(encoded_csv)
attachment.add_header("Content-Disposition", "attachment", filename="data_report.b64")
m.attach(attachment)
# 发送邮件
s = smtplib.SMTP()
s.connect()
s.sendmail(sender, [receiver], m.as_string())
s.close()
这个示例展示了如何结合邮件发送、CSV文件读取、数据编码和附件添加的操作。具体步骤如下:
1. 使用
csv
模块读取CSV文件内容。
2. 使用
base64
模块对CSV数据进行Base64编码。
3. 使用
email
模块创建邮件对象,添加邮件正文和附件。
4. 使用
smtplib
模块发送邮件。
5. 总结与建议
5.1 功能总结
-
网络浏览器操作
:
webbrowser模块提供了方便的功能,可在不同平台上以统一的方式打开网页,适用于开发和测试场景。 -
数据编码与处理
:
base64、binascii和csv模块分别用于不同类型的数据编码和处理,如二进制数据的Base64、Base32、Base16编码,以及CSV文件的读写操作。 -
电子邮件处理
:
email模块提供了强大的功能,可用于解析和编写电子邮件,支持多部分MIME邮件的处理。
5.2 建议
- 深入学习 :对于每个模块,建议深入学习其文档,了解更多高级功能和配置选项,以满足复杂的应用需求。
- 错误处理 :在实际应用中,要注意对可能出现的错误进行处理,如网络请求失败、文件读写错误、编码解码异常等。
- 代码优化 :对于性能要求较高的场景,可对代码进行优化,如使用更高效的算法、减少不必要的内存开销等。
5.3 流程图总结
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(网络浏览器操作):::process --> B(webbrowser模块):::process
C(数据编码与处理):::process --> D(base64模块):::process
C --> E(binascii模块):::process
C --> F(csv模块):::process
G(电子邮件处理):::process --> H(email模块):::process
I(综合应用):::process --> A
I --> C
I --> G
这个流程图总结了本文介绍的主要功能模块及其关系,展示了它们在综合应用中的作用。通过合理运用这些模块,我们可以构建出功能强大、灵活多样的Python应用程序。
总之,Python在网络编程和数据处理方面提供了丰富的工具和功能,通过深入学习和实践,我们可以充分发挥其优势,解决各种实际问题。
超级会员免费看
13万+

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



