Home Python基础
Post
Cancel

Python基础

正则表达式

在Python中使用正则表达式

  1. import re 导入正则表达式模块.
  2. re.compile() 函数创建一个 Regex 对象 (使用原始字符串 r'') .
  3. 调用 Regex 对象的 search() 方法传入想要查找的字符串, 并返回一个 Match 对象.
  4. 调用 Match 对象的 group() 方法, 返回实际匹配文本的字符串.
1
2
3
4
5
6
7
8
import re

phoneNumRegex = re.compile(r'\d{3}-\d{3}-\d{4}')
searchStr = input('Enter: ')
mo = phoneNumRegex.search(searchStr)
if not mo: print('NO MATCH!')
else:
    print('phone number found: ', mo.group())

修改正则表达式为 (\d{3})-(\d{3}-\d{4}) , 第一对括号对应 group(1) , 第二对括号对应 group(2) .

re.compile() 函数传入第二个参数 re.IGNORECASEre.I , 使正则表达式不区分大小写.

常用的匹配

RegexMatch
Batman|Tina FeyBatman or Tina Fey
Bat(man|women)Batman or Batwomen
Bat(wo)?manwords before '?' is optional
matchs same as above
Bat{3}BatBatBat
Bat{3,5}matches word ‘Bat’ repeated 3-5 times
e.g. ‘hahahahaha’ we get ‘hahahahaha’
Bat{3,5}?similar to above but matches word as few as possible
e.g. ‘hahahahaha’ we get ‘hahaha’
Bat{3,}
Bat{,5}
matches word ‘Bat’ repeated more than 2 times
matchs word ‘Bat’ repeated less than 6 times

sub() 方法替换字符串

Regex 对象的 sub() 方法有两个参数, 第一个参数是用来替代的字符串, 第二个是待匹配的字符串.

1
2
3
4
5
6
import re

namesRegex = re.compile(r'Agent \w+')
stg = 'Agent Alice gave the secret documents to Agent Bob'
stg = namesRegex.sub('Unknown', stg)
print(stg)

可在第一个参数中用 \1, \2... 表示用匹配得到的分组 (Group) 1, 2…的文本进行替换.

1
2
3
4
5
6
import re

namesRegex = re.compile(r'Agent (\w)\w*')
stg = 'Agent Alice gave the secret documents to Agent Bob'
stg = namesRegex.sub(r'\1****', stg)
print(stg)

方法 findall()search() 之间的区别

  • findall() 方法返回 list 类型, 每个 list item 为 tuple 类型, 由匹配的所有组构成.

    e.g. 以匹配邮箱的正则表达式 (([a-zA-Z0-9._%+-]+)@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}) 对字符串 '824658314@qq.com' 进行匹配, 结果为 [('824658314@qq.com', '824658314')] .

  • search() 方法返回 match 类型, 通过 match 对象的 group() 方法来获得匹配的各个组. 另由 groups() 方法获得匹配的所有组.

    e.g. 同上例, 由 group()824658314@qq.com , group(1) 亦得 824658314@qq.com , group(2)824658314 .

文件读写

os.path 模块中的常用函数

函数名描述
join()将参数合成为一个路径字符串
abspath()相对路径转化绝对路径
isabs()判断是否为绝对路径
relpath()有两个参数 path 和 start , 返回从 path 到 start 的路径字符串
dirname()返回路径的目录名称
basename()返回路径的基本名称(文件名)
split()返回路径目录名称和基本名称的 tuple
getsize()返回文件的字节数
exists()判断文件或文件夹是否存在

os 模块中的常用函数

函数名描述
makedirs()创建新文件夹
getcwd()获得当前工作目录
chdir()改变当前工作目录
listdir()返回当前文件夹中所有文件名的 list
unlink()删除目标文件
rmdir()删除目标文件夹,该文件夹需为空

调试

异常

  • raise 语句常出现在一个函数中, 以抛出异常. 其包含以下部分:

    • raise 关键字.
    • Exception() 函数的调用.
    • 将包含出错信息的字符串传给 Exception() 函数.
    1
    
    raise Exception('This is the error message.')
    
  • tryexcept 语句常在调用函数的代码中用来处理异常.

    1
    2
    3
    4
    
    try:
        func(x)
    except Exception as err:
        print('An exception happened: ' + str(err))
    

断言

断言语句包含以下部分:

  • assert 关键字.
  • 条件 (求值为 TrueFalse 的表达式).
  • 逗号.
  • 当条件为 False 时显示的字符串.
1
assert judgement == True, 'Error!'

日志

将下面的代码添加到程序顶部, 即可在程序运行时输出日志信息.

1
2
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

其中的参数 level 为日志级别, 有如下选项:

级别描述
DEBUG最低级别, 用于小细节.
INFO记录程序中的一般事件, 或确认工作一切正常
WARNING表示可能的问题, 但不会阻止程序工作
ERROR记录错误, 将导致程序执行某些任务时失败
CRITICAL最高级别, 表示致命错误, 将导致程序终止

通过调用函数 logging.disable(level) 函数, 将禁止 level 级别及更低级别的所有日志信息.

logging.basicConfig() 函数中传入参数 filename='...' 以将日志保存在指定文件中.

从 Web 抓取信息

request 模块下载文件

通过调用 request 模块中 get() 函数, 得到对应 URL 的 Reponse 对象.

Response 对象有如下常用成员:

成员名描述
text下载的页面作为字符串存储于该成员中
status_code反映对网页的请求是否成功
raise_for_status()当下载文件出错时抛出异常
iter_content()返回包含指定字节的一段内容

下面的代码从指定 URL 下载文件并保存到硬盘:

1
2
3
4
5
6
7
8
import requests

res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
res.raise_for_status()
txtFile = open('/Users/sameal/Desktop/1.txt', 'wb')
for chunk in res.iter_content(100000):
    txtFile.write(chunk)
txtFile.close()

BeautifulSoup 模块解析 HTML

创建 bs4 对象的两种方法:

  1. 利用 request.get() 方法下载页面, 再将 Response 对象的 text 属性传给 bs4.BeautifulSoup() 函数, 并携带第二个参数为 html.parser.
  2. 直接向 bs4.BeautifulSoup() 函数传递一个 HTML 文件, 并携带第二个参数为 html.parser.

bs4 解析 HTML 的步骤:

  1. 调用 request.get() 方法获取目标页面的 Response 对象.

  2. 创建目标页面的 bs4 对象.

  3. 调用 bs4 对象的 select() 方法, 获取指定内容的 list, 其中每个元素为一个 Tag 对象.

    其中 select() 方法的参数为 CSS 选择器的组合. 如下代码将匹配一个 <a> 标签, 这个标签直接包含在 idpage 的容器中, 该容器直接包含于符合类 row-fluidpage-wrap 的容器中.

    1
    
    soup.select('.row-fluid.page-wrap > #page > a')
    
  4. 通过 Tag 对象的 get() 方法, 传入的参数为 Tag 对象的一个属性名, 如 href, src 等.

处理 Excel 表格

读取

openpyxl 模块在最近更新中废弃了大量 get 方法, 改为直接获取属性值.

导入 openpyxl 模块后, 调用 openpyxl.load_workbook() 函数, 返回一个代表当前 Excel 文件的 Workbook 对象, 其有如下成员:

成员名描述
sheetnames获取所有工作表的名字``
[]返回指定工作表
active返回默认工作表
[:]返回指定区域内的的所有单元格
rows返回所有行的 list
columns返回所有列的 list

每个工作表由一个 Worksheet 对象表示, 用 [] 运算符能直接获得各个单元格的 Cell 对象, 也可通过调用方法 cell(row=, column=) 获得.

Cell 对象有如下成员:

成员名描述
value获取单元格的值
row获取行数
column获取列数
coordinate获取坐标

写入

通过调用 openpyxl.Workbook() 方法可以获得一个新的工作簿.

Workbook 对象中有一些用于写入数据的函数:

函数名描述
create_sheet(index=, title=)添加工作表
remove()删除指定工作表
传入参数为 Worksheet 类型, 而非名字

另外, 通过直接对属性赋值也能够起到修改工作表的作用.

在修改完成之后, 调用 Workbook 对象的 save() 方法将工作表保存在指定路径.

处理 Word 文档

python-docx 中, doc 文件用三种类型表示. Document 对象表示整个文档, 其包含一个 Paragraph 对象的列表, 表示文档中的段落. 每个 Paragraph 对象都包含一个 Run 对象的列表, 表示相同样式的文本. 上述三个对象均可由上级对象的属性获取.

若要向 doc 文件中写入数据, 则调用 docx.Document() 方法, 创建空白的 Document 对象. 其包含如下成员函数:

函数名描述
add_paragraph()添加新的段落
add_heading()添加标题, 传入第二个参数 0-4 代表标题的层次
add_picture()在文档末添加图像, 可选参数 width=height=

调用 Paragraph 对象的 add_run() 方法, 可添加不同格式的文本.

调用 Run 对象的 add_break() 方法, 可添加换行符. 若传入参数 docx.text.WD_BREAK.PAGE , 可添加换页符.

另外, 通过 Paragraph 和 Run 对象的 style 属性, 可改变文本样式.

处理 CSV 文件

Python 中内置用来处理 CSV 文件的模块 csv, 在程序开头导入即可.

将 CSV 文件路径作参数传给 csv.reader() 函数, 得到与文件相关联的 Reader 对象. 将 Reader 对象传递给 next() 函数, 返回一个 list, 其中元素为文件下一行各列的数据. 将上述列表作参数传给 enumerate() 函数, 返回该行中各列元素索引及其值构成的 tuple.

如下代码获得 CSV 文件中首行各元素的索引及值:

1
2
3
4
5
6
7
8
import csv

with open('pcc-master/chapter_16/sitka_weather_07-2014.csv') as csvFile:
    reader = csv.reader(csvFile)
    header_row = next(reader)

    for idx, column_header in enumerate(header_row):
        print(idx, column_header)

遍历 Reader 对象可访问 CSV 文件各行, 通过 [] 运算符可得到该行各列元素.

处理 JSON 文件

Python 中内置用来处理 JSON 文件的模块 json, 在程序开头导入即可.

将 JSON 文件路径作为参数传给 json.load() 函数, 即可获得文件中所有 dict 值构成的 list. 之后按照对 dict 的处理方式即可方便的对 JSON 文件进行处理.

数据可视化

pyplot 模块

导入 pyplot 模块的代码:

1
import matplotlib.pyplot as plt

pyplot 模块中的函数:

函数名描述
figure()生成空白画布
plot()传入两个 list 对象, 绘制对应的折线图在空白画布上
scatter()传入一组坐标或两个 list 对象,生成对应的散点图
show()显示绘制的图象
x/ylabel()设置 $x/y$ 轴的名称
x/ylim()设置 $x/y$ 轴标度的最大值和最小值
x/yticks()设置 $x/y$ 轴标度的范围和步长, 传入 np.linspace
tick_params()设置坐标轴刻度的样式
title()设置标题
axis()传入包含四个元素的 list , 设置坐标轴的取值范围
savefig()保存生成的图象

上述函数中还能传入其他参数:

参数名描述
figsize=设置图形的尺寸, 传入一个 tuple
linewidth=设置绘制线条的宽度
linestyle=设置线条样式, 如'-','-.'
s=设置绘制散点的尺寸
color=设置散点的颜色
cmap=配合 color= 使用颜色映射
fontsize=设置字号
edgecolor=设置数据点边缘色

更详细的内容在 Mathematics Module 板块中.

pygal 模块

pygal 模块中的成员:

成员名描述
Bar()创建条形图对象
_title设置或取得图表的标题
x/y_labels设置或取得 $x$ 轴和 $y$ 轴的标度
_x/y_title设置或取得 $x$ 轴和 $y$ 轴的名称
add()传入指定值的标签和指定值的列表, 填充到条形图中
render_to_file将图表保存到文件

处理日期

datetime 模块中 datetime 类的 strptime() 方法, 能够解析日期字符串, 其第一个参数为 str 对象, 第二个参数有多个可选值:

paraNameDescription
%Aname of week, e.g. Monday
%Bname of month, e.g. January
%mmonth expressed by number(01-12)
%dday expressed by number(01-31)
%Y4-digit year, e.g. 2018
%y2-digit years e.g. 18
%Hhour expressed in 24-hour format
%Ihour expressed in 12-hour format
%pam or pm
%Mminute (00-59)
%Ssecond (00-59)
This post is licensed under CC BY 4.0 by the author.