字符串和文本处理
字符串方法
字符串判断
方法 |
描述 |
isalnum() |
是否全是数字 |
isalpha() |
是否全是字母 |
isdigit() |
是否全是数字 |
islower() |
是否全是小写 |
isupper() |
是否全是大写 |
isspace() |
是否包含空格 |
istitle() |
是否是标题化的(以大写字母开头) |
startswith() |
是否以指定字符串开头 |
字符串大小写
方法 |
描述 |
capitalize() |
将字符串的第一个字符转换为大写 |
lower() |
将字符串中所有大写字符转换为小写 |
upper() |
将字符串中所有小写字符转换为大写 |
swapcase() |
将字符串中所有大写字符转换为小写,将所有小写字符转换为大写 |
title() |
将字符串中每个单词的首字母转换为大写 |
casefold() |
将字符串中所有大写字符转换为小写 |
字符串对齐
方法 |
描述 |
center() |
返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 |
ljust() |
返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串 |
rjust() |
返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串 |
zfill() |
返回指定长度的字符串,原字符串右对齐,前面填充0 |
expandtabs() |
把字符串中的 tab 符号(\t)转换为空格,如不指定参数,默认的空格数是 tabsize=8 |
strip() |
移除字符串头尾指定的字符(默认为空格或换行符)或字符序列 |
lstrip() |
移除字符串左边指定的字符(默认为空格或换行符)或字符序列 |
rstrip() |
移除字符串右边指定的字符(默认为空格或换行符)或字符序列 |
字符串查找
方法 |
描述 |
find() |
检测 str 是否包含在字符串中,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1 |
rfind() |
类似于 find() 函数,不过是从右边开始查找 |
index() |
检测 str 是否包含在字符串中,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则抛出异常 |
rindex() |
类似于 index(),不过是从右边开始 |
count() |
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 |
startswith() |
检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查 |
endswith() |
检查字符串是否以指定子字符串 ending 结束,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查 |
replace() |
把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次 |
拆分和查找
方法 |
描述 |
partition() |
把字符串 string 分成一个 3 元素的元组 (head, sep, tail),如果 string 中不包含 sep,则返回元组 (string, '', '') |
rpartition() |
类似于 partition() 函数,不过是从右边开始查找 |
split() |
通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串 |
rsplit() |
类似于 split() 方法,不过是从右边开始切片 |
splitlines() |
按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表 |
join() |
以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 |
翻译和抓换
maketrans()
: 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
translate()
: 根据参数table给出的表,转换字符串的字符,要过滤掉的字符放到deletechars参数中。
# maketrans() 用法
table = str.maketrans('aeiou', '12345')
print('this is string example....wow!!!'.translate(table, 'xm'))
# th3s 3s str3ng 2x1mpl2....w4w!!!
正则表达式
正则表达式是一种特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配。
- 元字符是一些预定义的特殊字符,用来表示一些特定的含义,如匹配数字、空白字符等。
元字符 |
描述 |
. |
匹配除换行符以外的任意字符 |
^ |
匹配字符串的开始 |
$ |
匹配字符串的结束 |
* |
匹配前一个字符出现0次或者无限次,即可有可无 |
+ |
匹配前一个字符出现1次或者无限次,即至少有1次 |
? |
匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
|
匹配前一个字符出现m次 |
|
匹配前一个字符出现从m到n次 |
| |
匹配 |
(...) |
将括号中字符作为一个分组 |
- 预定义字符集是一组预定义好的一些字符,用来表示一些特定的含义,如匹配数字、空白字符等。
预定义字符集 |
描述 |
\d |
匹配数字,等价于[0-9] |
\D |
匹配非数字,等价于[^0-9] |
\s |
匹配空白字符,等价于[\t\n\r\f\v] |
\S |
匹配非空白字符,等价于[^\t\n\r\f\v] |
\w |
匹配非特殊字符,即a-z、A-Z、0-9、_、汉字 |
\W |
匹配特殊字符,即非字母、非数字、非汉字 |
- 边界匹配符用来匹配字符串的边界,如匹配空格、换行、tab键等。
边界匹配符 |
描述 |
\b |
匹配一个单词的边界 |
\B |
匹配非单词边界 |
\A |
匹配字符串开始 |
\Z |
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
- 重复匹配符用来匹配字符重复出现的次数,如匹配一个字符出现3次等。
重复匹配符 |
描述 |
* |
匹配前一个字符出现0次或者无限次,即可有可无 |
+ |
匹配前一个字符出现1次或者无限次,即至少有1次 |
? |
匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
|
匹配前一个字符出现m次 |
|
匹配前一个字符出现至少m次 |
|
匹配前一个字符出现从m到n次 |
re模块
re模块是python中用于正则表达式操作的模块,包含了正则表达式的所有功能。
re.match()
: 从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.search()
: 扫描整个字符串并返回第一个成功的匹配。
re.findall()
: 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.split()
: 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型。
re.finditer()
: 与findall()函数类似,扫描整个字符串,并返回一个迭代器。
import re
# match() 用法
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
# search() 用法
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
# findall() 用法
print(re.findall(r'\d+', 'runoob 123 google 456')) # ['123', '456']
# split() 用法
print(re.split(r'\W+', 'runoob, runoob, runoob.')) # ['runoob', 'runoob', 'runoob', '']
print(re.split(r'(\W+)', 'runoob, runoob, runoob.')) # ['runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
# finditer() 用法
it = re.finditer(r'\d+', '12a32bc43jf3')
for match in it:
print(match.group())# 12 32 43 3
文件和数据交换
文件
文件操作
- 文件打开
open()
打开或创建文件对象
- 文件读写
read()
读取文件内容
write()
写入文件内容
readline()
读取一行内容
writelines()
写入多行内容
flush()
刷新文件内部缓冲区
- 文件关闭
close()
关闭文件,释放资源
内存文件操作
StringIO
:在内存中读写str
BytesIO
:在内存中读写二进制数据
from io import StringIO, BytesIO
# StringIO
f = StringIO()
f.write('hello')
f.write(' ')
f.write('world!')
print(f.getvalue()) # hello world!
# BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue()) # b'\xe4\xb8\xad\xe6\x96\x87'
文件的压缩和解压缩
gzip
:gzip格式的压缩和解压缩
bz2
:bzip2格式的压缩和解压缩
import gzip
import bz2
# gzip
with gzip.open('test.txt.gz', 'wb') as f:
f.write('hello world!'.encode('utf-8'))
with gzip.open('test.txt.gz', 'rb') as f:
print(f.read().decode('utf-8')) # hello world!
# bz2
with bz2.open('test.txt.bz2', 'wb') as f:
f.write('hello world!'.encode('utf-8'))
with bz2.open('test.txt.bz2', 'rb') as f:
print(f.read().decode('utf-8')) # hello world!
CSV文件操作
import csv
# 写入
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])
# 读取
with open('test.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# ['id', 'name', 'age']
# ['10001', 'Mike', '20']···
# 写入字典
with open('test.csv', 'w', newline='') as f:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})
# 读取字典
with open('test.csv', 'r') as f:
reader = csv.DictReader(f)
headers = reader.fieldnames
print(headers) # ['id', 'name', 'age']
for row in reader:
print(row['id'], row['name'], row['age'])
# 10001 Mike 20
# 10002 Bob 22
# 10003 Jordan 21
# Dialect 是一个编码风格的类,它被 reader() 和 writer() 用来确定如何解析或写入文件。
csv.register_dialect('mydialect', delimiter='|', quoting=csv.QUOTE_ALL)
with open('test.csv', 'w', newline='') as f:
writer = csv.writer(f, dialect='mydialect')
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])
with open('test.csv', 'r') as f:
reader = csv.reader(f, dialect='mydialect')
for row in reader:
print(row)
# ['id', 'name', 'age']
# ['10001', 'Mike', '20']···
对象序列化
对象序列化是指将对象转换为字节序列的过程,反之则是对象反序列化。
import pickle
# 序列化
d = dict(name='Bob', age=20, score=88)
print(pickle.dumps(d)) # b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x03\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'
# 反序列化
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()
f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
print(d) # {'name': 'Bob', 'age': 20, 'score': 88}
json
:将对象序列化为json字符串
json.dumps()
:将对象序列化为json字符串
json.dump()
:将对象序列化为json字符串并写入文件
json.loads()
:将json字符串反序列化为对象
json.load()
:将json字符串反序列化为对象并写入文件
import json
# 序列化
d = dict(name='Bob', age=20, score=88)
print(json.dumps(d)) # {"name": "Bob", "age": 20, "score": 88}
# 反序列化
json_str = '{"name": "Bob", "age": 20, "score": 88}'
print(json.loads(json_str)) # {'name': 'Bob', 'age': 20, 'score': 88}
数据库访问
sqlite3
sqlite3是python自带的轻量级数据库,可以直接使用。
import sqlite3
# 连接数据库
conn = sqlite3.connect('test.db')
# 创建游标
cursor = conn.cursor()
# 执行sql语句
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一条数据
cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
# 获取插入的行数
print(cursor.rowcount) # 1
# 关闭游标
cursor.close()
# 提交事务
conn.commit()
# 关闭连接
conn.close()
MySQL
MySQL是一个关系型数据库管理系统,可以使用python的mysql-connector
模块进行访问。
import mysql.connector
# 连接数据库
conn = mysql.connector.connect(user='root', password='password', database='test')
# 创建游标
cursor = conn.cursor()