1. Python有哪些库可以操作Mysql
主要有以下五个库
2. 安装一个Mysql,创建一个库pydb,作为本次练习使用的库
import mysql.connector
from mysql.connector import errorcode
# 配置数据库连接信息
config = {
'user': 'root', # 替换为您的MySQL用户名
'password': '123456', # 替换为您的MySQL密码
'host': 'localhost', # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
}
try:
# 尝试连接到MySQL服务器
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
# 创建数据库的SQL语句
create_database_query = "CREATE DATABASE IF NOT EXISTS pydb"
# 执行创建数据库的操作
cursor.execute(create_database_query)
print("数据库 'pydb' 创建成功")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("访问被拒绝:检查用户名和密码")
else:
print(err)
finally:
# 关闭游标和连接
if 'cursor' in locals() and cursor is not None:
cursor.close()
if 'cnx' in locals() and cnx is not None:
cnx.close()
3. 安装Faker库,并说明此库是干啥用的,什么场景下使用
Faker库是一个Python库,用于生成假数据。它可以帮助开发人员生成各种类型的假数据,如姓名、地址、电话号码、公司名称等。这些假数据可以用于测试、开发和数据模拟等场景。
4. 使用for循环调用Faker库,生成10条不重复的中文数据,每条数据中,包含姓名、性别、生日、地址、邮箱、手机号。
from faker import Faker
# 初始化 Faker 实例,并设置为中文环境
fake = Faker('zh_CN')
# 用于存储已生成的数据,确保唯一性
generated_data = set()
# 生成 10 条不重复的中文数据
while len(generated_data) < 10:
name = fake.name()
gender = fake.random_element(elements=('男', '女'))
birthday = fake.date_between(start_date='-30y', end_date='today')
address = fake.address()
email = fake.email()
phone_number = fake.phone_number()
# 将数据组合成元组,便于检查唯一性
data_entry = (name, gender, birthday, address, email, phone_number)
# 如果数据未重复,则添加到集合中
if data_entry not in generated_data:
generated_data.add(data_entry)
# 输出生成的数据
for idx, entry in enumerate(generated_data, start=1):
print(f"第 {idx} 条数据:")
print(f"姓名: {entry[0]}")
print(f"性别: {entry[1]}")
print(f"生日: {entry[2]}")
print(f"地址: {entry[3]}")
print(f"邮箱: {entry[4]}")
print(f"手机号: {entry[5]}")
print("-" * 40)
5. 创建一个数据表,id为主键自增、其他内容有姓名、性别、生日、地址、邮箱、手机号
import mysql.connector
from mysql.connector import errorcode
# 配置数据库连接信息
config = {
'user': 'root', # 替换为您的MySQL用户名
'password': '123456', # 替换为您的MySQL密码
'host': 'localhost', # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
'database': 'pydb' # 指定要使用的数据库
}
try:
# 连接到MySQL服务器和指定数据库
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
# 创建数据表的SQL语句
create_table_query = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
gender ENUM('男', '女') NOT NULL,
birthday DATE NOT NULL,
address TEXT NOT NULL,
email VARCHAR(255) NOT NULL,
phone VARCHAR(20) NOT NULL
)
"""
cursor.execute(create_table_query)
print("数据表 'users' 创建成功")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("访问被拒绝:检查用户名和密码")
else:
print(f"发生错误: {err}")
finally:
# 关闭游标和连接
if 'cursor' in locals() and cursor is not None:
cursor.close()
if 'cnx' in locals() and cnx is not None:
cnx.close()
6. 使用python中的faker生成随机数据,在上面创建的表中插入10000条数据。
import mysql.connector
from mysql.connector import errorcode
from faker import Faker
# 初始化 Faker 实例,并设置为中文环境
fake = Faker('zh_CN')
# 配置数据库连接信息
config = {
'user': 'root', # 替换为您的MySQL用户名
'password': '123456', # 替换为您的MySQL密码
'host': 'localhost', # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
'database': 'pydb' # 指定要使用的数据库
}
try:
# 连接到MySQL服务器和指定数据库
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
# 插入数据的SQL语句
insert_query = """
INSERT INTO users (name, gender, birthday, address, email, phone)
VALUES (%s, %s, %s, %s, %s, %s)
"""
# 批量生成并插入数据
batch_size = 1000
data_batch = []
for _ in range(10000):
name = fake.name()
gender = fake.random_element(elements=('男', '女'))
birthday = fake.date_between(start_date='-50y', end_date='today')
address = fake.address()
email = fake.email()
phone = fake.phone_number()
data_batch.append((name, gender, birthday, address, email, phone))
# 批量提交
if len(data_batch) == batch_size:
cursor.executemany(insert_query, data_batch)
cnx.commit()
print(f"已插入 {batch_size} 条数据")
data_batch = []
# 提交剩余数据
if data_batch:
cursor.executemany(insert_query, data_batch)
cnx.commit()
print(f"已插入剩余 {len(data_batch)} 条数据")
print("成功插入 10000 条数据!")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("访问被拒绝:检查用户名和密码")
else:
print(f"发生错误: {err}")
finally:
# 关闭游标和连接
if 'cursor' in locals() and cursor is not None:
cursor.close()
if 'cnx' in locals() and cnx is not None:
cnx.close()
7. 使用python读取数据库中的这些人的信息,并计算这10000人的平均年龄以及最年龄最大的比最小的大几岁。
import mysql.connector
from mysql.connector import errorcode
from datetime import datetime
# 配置数据库连接信息
config = {
'user': 'root', # 替换为您的MySQL用户名
'password': '123456', # 替换为您的MySQL密码
'host': 'localhost', # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
'database': 'pydb' # 指定要使用的数据库
}
try:
# 连接到MySQL服务器和指定数据库
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
# 查询所有用户的生日字段
select_query = "SELECT birthday FROM users"
cursor.execute(select_query)
birthdays = [row[0] for row in cursor.fetchall()]
# 计算当前年份
current_year = datetime.now().year
# 将生日转换为年龄
ages = [current_year - birthdate.year for birthdate in birthdays]
# 计算统计信息
average_age = sum(ages) / len(ages)
max_age = max(ages)
min_age = min(ages)
age_diff = max_age - min_age
# 输出结果
print(f"平均年龄: {average_age:.2f} 岁")
print(f"最大年龄: {max_age} 岁")
print(f"最小年龄: {min_age} 岁")
print(f"最大年龄比最小年龄大: {age_diff} 岁")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("访问被拒绝:检查用户名和密码")
else:
print(f"发生错误: {err}")
finally:
# 关闭游标和连接
if 'cursor' in locals() and cursor is not None:
cursor.close()
if 'cnx' in locals() and cnx is not None:
cnx.close()
8. 使用python统计这10000人中姓氏最多的前5位的具体数量(可以不考虑复姓)
import json
from collections import Counter
try:
# 打开并加载 JSON 文件
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
# 提取所有用户的姓氏(仅取名字的第一个字符)
surnames = [user['name'][0] for user in data]
# 统计姓氏出现的次数
surname_counts = Counter(surnames)
# 获取出现次数最多的前5个姓氏
top_5_surnames = surname_counts.most_common(5)
# 输出结果
print("姓氏统计 - 前5位:")
for surname, count in top_5_surnames:
print(f"姓氏 '{surname}': {count} 次")
except FileNotFoundError:
print("错误:文件未找到,请检查路径是否正确。")
except json.JSONDecodeError:
print("错误:文件内容不是有效的 JSON 格式。")
except Exception as e:
print(f"发生未知错误: {e}")
9. 统计这10000人的属相,只统计数量,以json格式体现,比如
{
"鼠":1224,
...
"猪":968
}
import json
from collections import Counter
# 定义属相列表,按照 12 年周期排列
zodiac_signs = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
try:
# 打开并加载 JSON 文件
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
# 计算每个人的属相,并统计数量
zodiac_counts = Counter()
for user in data:
birth_year = datetime.strptime(user['birthday'], '%Y-%m-%d').year
zodiac_index = (birth_year - 4) % 12 # 假设 2020 年是“鼠”年
zodiac = zodiac_signs[zodiac_index]
zodiac_counts[zodiac] += 1
# 将结果转换为 JSON 格式并输出
result_json = json.dumps(dict(zodiac_counts), ensure_ascii=False, indent=2)
print("属相统计结果(JSON 格式):")
print(result_json)
except FileNotFoundError:
print("错误:文件未找到,请检查路径是否正确。")
except json.JSONDecodeError:
print("错误:文件内容不是有效的 JSON 格式。")
except Exception as e:
print(f"发生未知错误: {e}")