【python基础】5.数据处理

发布时间 2024-01-04 11:19:48作者: asdio

字符串和文本处理

字符串方法

字符串判断

方法 描述
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

文件和数据交换

文件

文件操作

  1. 文件打开
    open()打开或创建文件对象
  2. 文件读写
    • read()读取文件内容
    • write()写入文件内容
    • readline()读取一行内容
    • writelines()写入多行内容
    • flush()刷新文件内部缓冲区
  3. 文件关闭
    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文件操作

  • csv: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']···

对象序列化

对象序列化是指将对象转换为字节序列的过程,反之则是对象反序列化。

  • pickle:将对象序列化为字节序列
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()