51、Python网络编程与数据处理全解析

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在网络编程和数据处理方面提供了丰富的工具和功能,通过深入学习和实践,我们可以充分发挥其优势,解决各种实际问题。

MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值