欢迎光临
我们一直在努力

Python 使用库入门:从标准库、第三方库到打包发布

Python 使用库入门:从标准库、第三方库到打包发布

头像

🔥 星恒随风:
个人主页

❄️ 个人专栏:
《指针合集》

《C语言基础》

《数据结构》

《机器学习导论》

《前端基础》

《python基础》

《C++从入门到入土》

✨ 数据即知识,压缩即智能


文章目录

  • Python 使用库入门:从标准库、第三方库到打包发布
    • 前言
    • 一、什么是库?
    • 二、标准库和第三方库
      • 1. 标准库
      • 2. 第三方库
    • 三、模块、包和库有什么区别?
      • 1. 模块 module
      • 2. 包 package
      • 3. 库 library
    • 四、使用 import 导入模块
    • 五、from import:只导入需要的内容
    • 六、as:给模块起别名
    • 七、标准库示例一:日期计算 datetime
    • 八、内置类型的方法也是“现成工具”
      • 1. 翻转句子中的单词顺序
      • 2. 判断旋转字符串
      • 3. 判断字符串前缀
    • 九、标准库示例二:文件查找工具 os.walk
    • 十、第三方库从哪里来?
    • 十一、使用 pip 安装第三方库
      • 1. 推荐使用 python -m pip
      • 2. pip 不是内部或外部命令怎么办?
    • 十二、第三方库示例一:生成二维码 qrcode
      • 1. 安装
      • 2. 编写代码
      • 3. 更完整一点的写法
    • 十三、第三方库示例二:操作 Excel
      • 1. 使用 xlrd 读取 xlsx 的旧写法
      • 2. 更推荐的新写法:openpyxl
    • 十四、第三方库示例三:程序员鼓励师
      • 使用多线程避免卡顿
    • 十五、综合案例:命令行学生管理系统
    • 十六、学生管理系统:基本框架
    • 十七、实现新增学生
    • 十八、显示学生
    • 十九、查找学生
    • 二十、删除学生
    • 二十一、加入文件存档
      • 1. 存档函数 save
    • 二十二、实现读档函数
    • 二十三、打包成 exe 程序
      • 1. 安装 PyInstaller
      • 2. 打包程序
    • 二十四、使用库时的几个建议
      • 1. 先判断标准库能不能解决
      • 2. 第三方库优先看官方文档
      • 3. 注意版本问题
      • 4. 多个 Python 环境时要看解释器
      • 5. 不要为了用库而用库
    • 总结

前言

刚开始学 Python 的时候,我们经常会把重点放在语法上,比如变量、循环、函数、列表、字典这些内容。

这些当然很重要,但真正写程序时,你会很快发现:光会语法还不够。

比如现在有几个需求:

  • 计算两个日期之间相差多少天
  • 批量查找某个文件夹下的文件
  • 生成一个二维码
  • 读取 Excel 表格里的数据
  • 监听键盘按键并播放提示音
  • 把写好的 Python 程序打包成 exe

如果每个功能都从零开始写,难度会非常高,效率也很低。

这时候就要用到 Python 的“库”。

简单来说:

库就是别人已经写好的代码,我们可以直接拿来使用。

这也是 Python 非常受欢迎的原因之一。Python 语法本身比较简洁,同时还有非常丰富的标准库和第三方库。很多时候,我们不需要重复造轮子,而是要学会找到合适的轮子,并把它用好。


一、什么是库?

库可以理解为一批提前写好的代码集合。

比如你要处理日期,不需要自己去判断闰年、月份天数、日期差值,Python 已经提供了 datetime。

比如你要遍历文件夹,不需要自己从操作系统底层开始写,Python 已经提供了 os。

比如你要生成二维码,也不需要自己研究二维码编码规则,可以直接使用第三方库 qrcode。

这就是使用库的意义:

把常见、通用、成熟的功能封装起来,需要时直接调用。

正所谓:

君子性非异也,善假于物也。

写程序也是一样。优秀的程序员并不是所有代码都自己手写,而是知道什么时候该自己实现,什么时候该合理利用现成工具。

在这里插入图片描述


二、标准库和第三方库

按照来源不同,Python 的库大致可以分成两类:

  • 标准库
  • 第三方库

1. 标准库

标准库就是 Python 自带的库。

只要你安装了 Python,就可以直接使用这些库,不需要额外安装。

常见标准库包括:

datetime 处理日期和时间
os 操作系统相关功能
sys Python 解释器相关功能
math 数学计算
random 随机数
json JSON 数据处理
threading 多线程
sqlite3 操作 SQLite 数据库
pathlib 面向对象的路径操作

标准库的特点是:

  • 稳定
  • 官方维护
  • 不需要额外安装
  • 适合解决很多常见问题

2. 第三方库

第三方库就是 Python 官方之外的人、组织或者公司写好的库。

比如:

requests 网络请求
numpy 数值计算
pandas 表格数据处理
matplotlib 数据可视化
qrcode 生成二维码
openpyxl 读写 Excel xlsx 文件
pyinstaller 打包 Python 程序

第三方库的特点是:

  • 数量非常多
  • 覆盖领域很广
  • 通常需要额外安装
  • 质量参差不齐,需要学会选择

Python 的强大,很大一部分就来自第三方库生态。 、在这里插入图片描述


三、模块、包和库有什么区别?

初学时经常会混淆这几个概念。

1. 模块 module

模块通常就是一个 .py 文件。

比如你写了一个文件:

tools.py

它里面定义了函数、变量、类,那么这个文件就可以看成一个模块。

在另一个文件中可以这样导入:

import tools

2. 包 package

包可以理解为一组模块的集合。

通常一个文件夹中包含 __init__.py,就可以被 Python 当成包来处理。

比如:

my_package/
__init__.py
file_tools.py
string_tools.py

这就是一个包。

3. 库 library

库是一个更宽泛的说法。

一个库可能只是一个模块,也可能是一个包,还可能包含很多子包、文档和工具。

日常交流中,我们不必把这几个词抠得太死。可以先这样理解:

模块:一个 .py 文件
包:多个模块组织成的文件夹
库:可以被我们复用的一套代码


四、使用 import 导入模块

Python 使用 import 导入模块。

基本写法:

import 模块名

例如导入 datetime:

import datetime

导入后,可以通过:

模块名.成员

来使用里面的功能。 在这里插入图片描述 比如:

import datetime

date1 = datetime.datetime(2012, 2, 14)
date2 = datetime.datetime(2022, 7, 12)

print(date2 date1)

这里:

datetime.datetime(2012, 2, 14)

第一个 datetime 是模块名,第二个 datetime 是模块里的类名。

这段代码会输出两个日期之间相差的时间。

在这里插入图片描述


五、from import:只导入需要的内容

除了 import 模块名,也可以使用:

from 模块名 import 成员名

比如:

from datetime import datetime

date1 = datetime(2012, 2, 14)
date2 = datetime(2022, 7, 12)

print(date2 date1)

这种写法的好处是代码更短。

原来要写:

datetime.datetime(...)

现在只需要写:

datetime(...)

不过也要注意,from import 用多了,名字可能会混乱。初学阶段建议优先使用:

import 模块名

这种写法虽然稍微长一点,但来源更清楚。


六、as:给模块起别名

有些模块名比较长,或者大家已经形成了固定习惯,就会使用 as 起别名。

例如:

import numpy as np
import pandas as pd

as 的意思是“作为”。

import datetime as dt

date1 = dt.datetime(2012, 2, 14)
date2 = dt.datetime(2022, 7, 12)

print(date2 date1)

这个写法在数据分析、机器学习领域非常常见。

不过别名不要乱起。比如:

import datetime as d

虽然能运行,但可读性并不好。别人看到 d.datetime(…),还要猜 d 是什么。


七、标准库示例一:日期计算 datetime

datetime 是 Python 标准库中处理日期和时间的模块。

假设我们想计算两个日期相差多少天:

import datetime

date1 = datetime.datetime(2012, 2, 14)
date2 = datetime.datetime(2022, 7, 12)

delta = date2 date1
print(delta)
print(delta.days)

输出大致是:

3801 days, 0:00:00
3801

date2 – date1 得到的是一个时间差对象。

如果只想要相差的天数,可以使用:

delta.days

这个例子体现了使用库的价值。

如果不用 datetime,我们可能要自己处理:

  • 每个月多少天
  • 闰年怎么算
  • 日期跨年怎么办
  • 两个日期谁在前谁在后

这会让一个很简单的需求变得麻烦。


八、内置类型的方法也是“现成工具”

有些功能甚至不需要导入模块,因为 Python 的内置类型已经自带很多方法。

比如字符串 str。

1. 翻转句子中的单词顺序

题目:

输入:"I am a student."
输出:"student. a am I"

可以这样写:

def reverse_words(s):
words = s.split()
words.reverse()
return ' '.join(words)

print(reverse_words('I am a student.'))

这里用到了三个常见方法:

split()
reverse()
join()

拆开看:

s.split()

把字符串按照空白字符切成列表:

['I', 'am', 'a', 'student.']

然后:

words.reverse()

把列表原地反转:

['student.', 'a', 'am', 'I']

最后:

' '.join(words)

用空格把列表拼回字符串:

student. a am I

在这里插入图片描述

2. 判断旋转字符串

题目:

s = "abcde"
goal = "cdeab"

如果不断把 s 左边第一个字符移动到最右边,能不能得到 goal?

一个很巧的写法是:

def rotate_string(s, goal):
return len(s) == len(goal) and goal in s + s

print(rotate_string('abcde', 'cdeab'))

为什么这样可以?

假设:

s = "abcde"

那么:

s + s = "abcdeabcde"

所有旋转结果都会出现在 s + s 里。

例如:

abcde
bcdea
cdeab
deabc
eabcd

所以只需要判断 goal 是否是 s + s 的子串。

3. 判断字符串前缀

def count_prefixes(words, s):
count = 0
for word in words:
if s.startswith(word):
count += 1
return count

print(count_prefixes(["a", "b", "c", "ab", "bc", "abc"], "abc"))

startswith() 可以判断一个字符串是否以另一个字符串开头。

这类方法非常实用,平时写代码时应该多积累。


九、标准库示例二:文件查找工具 os.walk

如果我们想在某个目录下查找文件名中包含关键字的文件,可以使用 os.walk。

os.walk 会递归遍历一个目录,并返回三部分信息:

当前路径
当前路径下的目录列表
当前路径下的文件列表

示例代码:

import os

input_path = input('请输入待搜索路径: ')
pattern = input('请输入待搜索关键词: ')

for dirpath, dirnames, filenames in os.walk(input_path):
for filename in filenames:
if pattern in filename:
print(os.path.join(dirpath, filename))

这里建议使用:

os.path.join(dirpath, filename)

而不是手动写:

dirpath + '/' + filename

原因是不同操作系统路径分隔符可能不同。

Windows 常见路径是:

D:\\test\\demo.txt

Linux/macOS 常见路径是:

/home/user/demo.txt

os.path.join 能帮我们更稳妥地拼接路径。

如果你使用的是较新的 Python,也可以考虑 pathlib,它的写法更现代:

from pathlib import Path

input_path = Path(input('请输入待搜索路径: '))
pattern = input('请输入待搜索关键词: ')

for file in input_path.rglob('*'):
if file.is_file() and pattern in file.name:
print(file)

pathlib 把路径当成对象来处理,代码可读性更好。

在这里插入图片描述


十、第三方库从哪里来?

标准库已经很强,但它不可能覆盖所有需求。

比如:

  • 生成二维码
  • 处理 Excel
  • 做爬虫
  • 做数据分析
  • 做机器学习
  • 做 Web 后端
  • 做自动化办公

这些场景通常会用到第三方库。

第三方库一般发布在 PyPI 上。

可以把 PyPI 理解成 Python 的“应用商店”。别人写好的库发布到 PyPI,我们通过 pip 安装,就可以在自己的项目里使用。


十一、使用 pip 安装第三方库

pip 是 Python 常用的包管理工具。

最基本写法:

pip install 库名

比如安装 qrcode:

pip install qrcode

如果需要带图片处理支持,可以安装:

pip install "qrcode[pil]"

在 Windows 的命令行中,如果遇到引号问题,也可以尝试:

pip install qrcode[pil]

在这里插入图片描述

1. 推荐使用 python -m pip

有时候电脑上装了多个 Python 版本,直接执行 pip 可能会装到另一个 Python 环境里。

更稳妥的写法是:

python -m pip install 库名

比如:

python -m pip install qrcode[pil]

这样可以明确使用当前 python 对应的 pip。

2. pip 不是内部或外部命令怎么办?

如果命令行提示:

'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。

常见原因是 Python 或 pip 没有加入环境变量。

可以尝试:

python -m pip –version

如果这个能运行,就说明 pip 本身存在,只是 pip 命令没有直接加入 PATH。

如果连 python 也找不到,可能需要重新安装 Python,并勾选:

Add Python to PATH


十二、第三方库示例一:生成二维码 qrcode

现在我们用 qrcode 生成一个二维码。

1. 安装

python -m pip install qrcode[pil]

2. 编写代码

import qrcode

img = qrcode.make('Hello Python')
img.save('qrcode.png')

运行后,会在当前目录下生成:

qrcode.png

二维码本质上可以理解为:

用黑白点阵保存一段字符串信息。

这段字符串可以是普通文本,也可以是一个网址。

比如:

import qrcode

url = 'https://www.example.com'
img = qrcode.make(url)
img.save('site.png')

扫码后,很多软件会自动识别为链接并跳转。

3. 更完整一点的写法

如果想设置二维码大小、边框等参数,可以这样写:

import qrcode

qr = qrcode.QRCode(
version=1,
box_size=10,
border=4
)

qr.add_data('Hello Python')
qr.make(fit=True)

img = qr.make_image(fill_color='black', back_color='white')
img.save('qrcode.png')

初学阶段先掌握 qrcode.make() 就够了,后面需要自定义样式时再查文档。


十三、第三方库示例二:操作 Excel

Python 操作 Excel 是非常常见的自动化办公场景。

原文中使用了 xlrd 读取 Excel。这里要特别提醒一点:

新版本 xlrd 主要用于读取 .xls 文件。如果要读取 .xlsx,更推荐使用 openpyxl;如果必须使用原文中的 xlrd 读取 .xlsx,需要指定旧版本 xlrd==1.2.0。

1. 使用 xlrd 读取 xlsx 的旧写法

安装:

python -m pip install xlrd==1.2.0

假设表格内容如下:

姓名班级分数
张三 100 68
李四 100 76
王五 100 74
赵六 101 89
田七 101 75
周八 100 90
刘九 101 57

需求:求 100 班的平均分。

示例代码:

import xlrd

xlsx = xlrd.open_workbook('d:/test.xlsx')
table = xlsx.sheet_by_index(0)

nrows = table.nrows

count = 0
total = 0

for i in range(1, nrows):
class_id = table.cell_value(i, 1)
score = table.cell_value(i, 2)

if class_id == 100:
total += score
count += 1

print(f'平均分: {total / count}')

这里用到的核心接口:

open_workbook() 打开 Excel 文件
sheet_by_index(0) 获取第 0 个工作表
table.nrows 获取行数
cell_value(row, col) 获取指定单元格数据

2. 更推荐的新写法:openpyxl

现在处理 .xlsx,更推荐使用 openpyxl。

安装:

python -m pip install openpyxl

代码示例:

from openpyxl import load_workbook

wb = load_workbook('d:/test.xlsx')
sheet = wb.active

count = 0
total = 0

for row in range(2, sheet.max_row + 1):
class_id = sheet.cell(row=row, column=2).value
score = sheet.cell(row=row, column=3).value

if class_id == 100:
total += score
count += 1

print(f'平均分: {total / count}')

如果你只是初学,先理解思路即可:

打开文件 -> 获取工作表 -> 遍历行 -> 读取单元格 -> 计算结果


十四、第三方库示例三:程序员鼓励师

这个例子比较有趣:监听键盘按键,每按一定次数,就播放一个提示音,鼓励一下正在写代码的自己。

需要两个库:

pynput 监听键盘
playsound 播放音频

安装:

python -m pip install pynput==1.6.8
python -m pip install playsound==1.2.2

准备一个音频文件:

ding.mp3

放在 Python 文件同级目录下。

基础代码:

from pynput import keyboard
from playsound import playsound

count = 0

def on_release(key):
global count
print(key)

count += 1
if count % 10 == 0:
playsound('ding.mp3')

listener = keyboard.Listener(on_release=on_release)
listener.start()
listener.join()

这段代码的逻辑是:

监听按键释放事件
每释放一次按键,count 加 1
当 count 是 10 的倍数时,播放音频

使用多线程避免卡顿

上面的代码有一个问题:播放音频时可能会阻塞当前流程,导致按键监听短暂卡顿。

可以使用 threading.Thread 改进:

from pynput import keyboard
from playsound import playsound
from threading import Thread

count = 0

def on_release(key):
global count
print(key)

count += 1
if count % 10 == 0:
t = Thread(target=playsound, args=('ding.mp3',))
t.start()

listener = keyboard.Listener(on_release=on_release)
listener.start()
listener.join()

这里:

Thread(target=playsound, args=('ding.mp3',))

表示创建一个新线程来执行:

playsound('ding.mp3')

这样播放音频不会明显影响主线程监听键盘。


十五、综合案例:命令行学生管理系统

前面我们讲了库的使用,现在用一个综合案例把内容串起来。

需求:实现一个命令行版本的学生管理系统。

功能包括:

1. 新增学生
2. 显示学生
3. 查找学生
4. 删除学生
5. 存档到文件
0. 退出程序

学生信息可以用字典表示:

student = {
'studentId': '001',
'name': '张三',
'gender': '男',
'className': '100'
}

所有学生用列表保存:

students = []


十六、学生管理系统:基本框架

先写主函数和菜单函数。

import sys

students = []

def menu():
print()
print("1. 新增学生信息")
print("2. 显示所有学生信息")
print("3. 根据姓名查找学生信息")
print("4. 删除学生信息")
print("0. 退出程序")

choice = input("请输入您的选择: ")
return int(choice)

def main():
print('+————————–+')
print('| 欢迎来到学生管理系统 |')
print('+————————–+')

while True:
choice = menu()

if choice == 0:
sys.exit()
elif choice == 1:
insert()
elif choice == 2:
show()
elif choice == 3:
find()
elif choice == 4:
delete()
else:
print('输入有误,请重新输入!')

这里使用了标准库 sys。

sys.exit()

可以让程序退出。


十七、实现新增学生

def insert():
print("[新增学生] 开始!")

student_id = input("请输入学生的学号: ")
name = input("请输入学生的姓名: ")
gender = input("请输入学生的性别: ")

if gender not in ('男', '女'):
print("性别不符合要求,新增学生失败!")
return

class_name = input("请输入学生的班级: ")

student = {
'studentId': student_id,
'name': name,
'gender': gender,
'className': class_name
}

students.append(student)

print("[新增学生] 完毕!")

这里学生信息使用字典保存,然后添加到全局列表 students 中。


十八、显示学生

def show():
print("[显示学生] 开始!")

for s in students:
print(f"{s['studentId']}\\t{s['name']}\\t{s['gender']}\\t{s['className']}")

print(f"[显示学生] 完毕!共显示 {len(students)} 条记录。")

\\t 是制表符,可以让输出更整齐。


十九、查找学生

def find():
print("[查找学生] 开始!")

name = input("请输入要查找的学生姓名: ")
count = 0

for s in students:
if name == s['name']:
print(f"{s['studentId']}\\t{s['name']}\\t{s['gender']}\\t{s['className']}")
count += 1

print(f"[查找学生] 完毕!共查找到 {count} 条记录。")

查找的本质就是遍历列表,判断字典中的某个字段是否符合要求。


二十、删除学生

def delete():
print("[删除学生] 开始!")

student_id = input("请输入要删除的学生学号: ")
count = 0

for s in students[:]:
if student_id == s['studentId']:
print(f"删除 {s['name']} 同学的信息!")
students.remove(s)
count += 1

print(f"[删除学生] 完毕!共删除 {count} 条记录。")

这里注意:

for s in students[:]:

使用的是列表切片副本。

为什么不直接写:

for s in students:

因为一边遍历列表,一边删除列表中的元素,容易导致遍历过程出问题。用副本遍历会更稳妥。


二十一、加入文件存档

如果只把学生信息放在列表里,程序一结束,数据就没了。

所以我们需要把数据保存到文件中。

约定保存到:

d:/record.txt

每个学生一行,字段之间用 \\t 分隔:

001 张三 男 100
002 李四 女 101

1. 存档函数 save

def save():
with open('d:/record.txt', 'w', encoding='utf-8') as f:
for s in students:
f.write(f"{s['studentId']}\\t{s['name']}\\t{s['gender']}\\t{s['className']}\\n")

print(f"[存档成功] 共存储 {len(students)} 条记录。")

这里使用:

with open(...) as f:

好处是文件用完后会自动关闭。

可以在新增和删除后调用:

save()

比如:

students.append(student)
save()

删除后也一样:

students.remove(s)
save()


二十二、实现读档函数

程序启动时,需要从文件中把历史数据读回来。

import os

def load():
if not os.path.exists('d:/record.txt'):
return

students.clear()

with open('d:/record.txt', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
tokens = line.split('\\t')

if len(tokens) < 4:
print(f"文件格式有误: line={line}")
continue

student = {
'studentId': tokens[0],
'name': tokens[1],
'gender': tokens[2],
'className': tokens[3]
}

students.append(student)

print(f"[读档成功] 共读取 {len(students)} 条记录。")

这里用到了标准库 os:

os.path.exists('d:/record.txt')

判断存档文件是否存在。

然后在 main() 开头调用:

def main():
load()

print('+————————–+')
print('| 欢迎来到学生管理系统 |')
print('+————————–+')

while True:
...

这样程序每次启动时都会先读取历史数据。

在这里插入图片描述


二十三、打包成 exe 程序

Python 脚本默认需要在安装了 Python 环境的电脑上运行。

如果想把程序发给别人,并希望别人不安装 Python 也能运行,可以使用 PyInstaller 打包。

1. 安装 PyInstaller

python -m pip install pyinstaller

2. 打包程序

进入 .py 文件所在目录,然后执行:

pyinstaller -F 学生管理系统.py

其中:

-F

表示打包成单个可执行文件。

打包完成后,一般会生成几个目录:

build/
dist/
学生管理系统.spec

最终 exe 文件通常在:

dist/

目录下。

注意:原文里写成了 pyinstall -F,实际命令应为:

pyinstaller -F 文件名.py

在这里插入图片描述


二十四、使用库时的几个建议

1. 先判断标准库能不能解决

比如:

日期时间 datetime
文件路径 os / pathlib
随机数 random
JSON 数据 json
多线程 threading
退出程序 sys.exit

这些都不需要安装第三方库。

能用标准库解决的,就优先用标准库。

2. 第三方库优先看官方文档

搜索第三方库时,不要只复制网上的代码。

比较稳的流程是:

搜索需求
找到常用库
进入 PyPI 或官方文档
查看安装方式
查看最小示例
自己写一个 demo 验证
再放进项目

这比直接复制一大段代码可靠得多。

3. 注意版本问题

很多初学者遇到的问题不是代码写错,而是版本不对。

比如:

pip install xlrd

装到新版本后,可能无法读取 .xlsx。

所以有时候要指定版本:

pip install xlrd==1.2.0

或者改用更适合的库:

pip install openpyxl

4. 多个 Python 环境时要看解释器

如果你明明安装了库,但 PyCharm 还是提示找不到模块,通常要检查:

Settings -> Project -> Python Interpreter

看看当前项目使用的解释器是不是你刚才安装库的那个 Python。

命令行中也可以用:

python -m pip show 库名

查看库到底装到了哪里。

5. 不要为了用库而用库

库是工具,不是目的。

简单需求用几行代码就能解决,就不一定非要引入第三方库。

比如判断字符串前缀:

s.startswith(word)

已经足够好,就没必要再找库。


总结

Python 的库,是 Python 学习中非常关键的一部分。

语法决定你能不能写程序,库决定你能不能高效地写程序。

初学时可以按照这个顺序学习:

先掌握标准库
再学习 pip
再尝试第三方库
最后做综合小项目

标准库中,建议优先熟悉:

datetime
os
sys
json
random
pathlib
threading

第三方库中,可以根据方向逐步接触:

qrcode 生成二维码
openpyxl 操作 Excel
requests 网络请求
pandas 数据分析
matplotlib 数据可视化
pyinstaller 程序打包

不要试图一次性记住所有库。更现实的做法是:知道有哪些工具,知道它们大概能解决什么问题,需要时再查文档、写 demo、放进项目。

赞(0)
未经允许不得转载:171主机测评 » Python 使用库入门:从标准库、第三方库到打包发布
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址