【Python库和代码案例:第一课】Python 标准库与第三方库实战指南:从日期处理到 Excel 操作


🎬 个人主页艾莉丝努力练剑
专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:


文章目录

  • [1 ~> 使用库:标准库和第三方库](#1 ~> 使用库:标准库和第三方库)
  • [2 ~> 标准库](#2 ~> 标准库)
    • [2.1 认识标准库](#2.1 认识标准库)
      • [2.1.1 理论](#2.1.1 理论)
    • [2.2 使用 import 导入模块](#2.2 使用 import 导入模块)
      • [2.2.1 理论](#2.2.1 理论)
      • [2.2.2 最佳实践](#2.2.2 最佳实践)
    • [2.3 代码示例:日期计算](#2.3 代码示例:日期计算)
      • [2.3.1 理论](#2.3.1 理论)
      • [2.3.2 最佳实践](#2.3.2 最佳实践)
      • [2.3.3 英文文档看不懂的问题](#2.3.3 英文文档看不懂的问题)
    • [2.4 代码示例:字符串操作](#2.4 代码示例:字符串操作)
      • [2.4.1 剑指offer 58:翻转单词顺序](#2.4.1 剑指offer 58:翻转单词顺序)
        • [2.4.1.1 理论](#2.4.1.1 理论)
        • [2.4.1.2 答案参考](#2.4.1.2 答案参考)
        • [2.4.1.3 最佳实践](#2.4.1.3 最佳实践)
      • [2.4.2 leetcode 796:旋转字符串](#2.4.2 leetcode 796:旋转字符串)
        • [2.4.2.1 理论](#2.4.2.1 理论)
        • [2.4.2.2 参考答案](#2.4.2.2 参考答案)
        • [2.4.2.3 最佳实践](#2.4.2.3 最佳实践)
      • [2.4.3 leetcode 2255:统计是给定字符串前缀的字符串数目](#2.4.3 leetcode 2255:统计是给定字符串前缀的字符串数目)
        • [2.4.3.1 理论](#2.4.3.1 理论)
        • [2.4.3.2 参考答案](#2.4.3.2 参考答案)
        • [2.4.3.3 最佳实践](#2.4.3.3 最佳实践)
      • [2.4.4 其它字符串操作](#2.4.4 其它字符串操作)
    • [2.5 代码示例:文件查找工具](#2.5 代码示例:文件查找工具)
      • [2.5.1 理论](#2.5.1 理论)
      • [2.5.2 最佳实践](#2.5.2 最佳实践)
      • [2.5.3 其它os模块操作](#2.5.3 其它os模块操作)
  • [3 ~> 第三方库](#3 ~> 第三方库)
    • [3.1 认识第三方库](#3.1 认识第三方库)
    • [3.2 使用pip](#3.2 使用pip)
      • [3.2.1 理论](#3.2.1 理论)
      • [3.2.2 最佳实践](#3.2.2 最佳实践)
    • [3.3 代码示例:生成二维码](#3.3 代码示例:生成二维码)
      • [3.3.1 通过搜索引擎,确定使用哪个库](#3.3.1 通过搜索引擎,确定使用哪个库)
      • [3.3.2 查看 qrcode 文档](#3.3.2 查看 qrcode 文档)
      • [3.3.3 使用 pip 安装](#3.3.3 使用 pip 安装)
      • [3.3.4 编写代码](#3.3.4 编写代码)
      • [3.3.5 最佳实践](#3.3.5 最佳实践)
    • [3.4 代码示例:操作 excel](#3.4 代码示例:操作 excel)
      • [3.4.1 理论](#3.4.1 理论)
      • [3.4.2 需求](#3.4.2 需求)
      • [3.4.3 操作](#3.4.3 操作)
        • [3.4.3.1 安装 xlrd](#3.4.3.1 安装 xlrd)
        • [3.4.3.2 编写代码](#3.4.3.2 编写代码)
      • [3.4.4 最佳实践](#3.4.4 最佳实践)
  • 结尾


1 ~> 使用库:标准库和第三方库

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

荀子曰:"君子性非异也,善假于物也"。

一个编程语言能不能流行起来,一方面取决于语法是否简单方便容易学习,一方面取决于生态是否完备。

所谓的"生态"指的就是语言是否有足够丰富的库,来应对各种各样的场景。

实际开发中,也并非所有的代码都自己手写,而是要充分利用现成的库,简化开发过程。

按照库的来源,可以大致分成两大类------

  • 标准库:Python自带的库.只要安装了Python就可以直接使用。

  • 第三方库:其他人实现的库,要想使用,需要额外安装。

咱们自己也可以实现"第三方库"发布出去,交给别人来使用。

来源,可以大致分成以上两大类。


2 ~> 标准库

2.1 认识标准库

2.1.1 理论

Python 自身内置了非常丰富的库,在Python官方文档上可以看到这些库的内容:Python 官方文档

简单来说, 主要是这些部分:

  • 内置函数 (如 print, input 等)
    -内置类型 (针对 int, str, bool, list, dict 等类型内置的操作).
  • 文本处理
  • 时间日期
  • 数学计算
  • 文件目录
  • 数据存储 (操作数据库, 数据序列化等)
  • 加密解密
  • 操作系统相关
  • 并发编程相关 (多进程, 多线程, 协程, 异步等).
  • 网络编程相关
  • 多媒体相关 (音频处理, 视频处理等)
  • 图形化界面相关
  • ...

我们不需要把这些库的内容都背下来,只要大概知道里面有啥,需要用的时候能够找到即可。

2.2 使用 import 导入模块

2.2.1 理论

使用import可以导入标准库的一个 模块

python 复制代码
import [模块名]

所谓"模块",其实就是一个单独的.py文件。

使用import语句可以把这个外部的.py文件导入到当前.py文件中,并执行其中的代码。

2.2.2 最佳实践

最佳实践等到后面我们使用起来就知道啦。

2.3 代码示例:日期计算

2.3.1 理论

输入任意的两个日期,计算两个日期之间隔了多少天。

  • 使用import语句导入标准库的datetime模块。
  • 使用datetime.datetime构造两个日期,参数使用年 / 月 / 日这样的格式。
  • 两个日期对象相减,即可得到日期的差值。
python 复制代码
import datetime

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

print(date2 - date1)

嘻嘻,快来看一下你和心爱的人已经认识了多少天了!

关于datetime的更多操作,可以参考官方文档:datetime

2.3.2 最佳实践

python 复制代码
# 代码案例:日期计算器(日期之间作差)

# datetime
# import datetime # (import)导入对应的模块
# # 先构造 datetime 变量
#
# # datetime.datetime(模块名.类型名)
# date1 = datetime.datetime(2006,12,14)
# date2 = datetime.datetime(2025,12,14)
# # 也可以通过关键字参数传
# # date1 = datetime.datetime(year=2025,month=12,day=14)    # 更加直观
# print(date2 - date1)    # 两种相减可得出相差多久

# # 这样写还有点别扭,我们可以直接这样写
# from datetime import datetime   # 变成从datetime模块import一个datetime类型
# # 通过这样的改变,让我们后续无需再写[datetime.] --> [模块名.]的方式------改进的写法
#
# # 先构造 datetime 变量
# date1 = datetime(2006,12,14)
# date2 = datetime(2025,12,14)
# print(date2 - date1)    # 结果完全一样

# 还有一种写法:既能在这行代码中知道模块名是什么,也能体现出后续构造的对象是什么类型
# 比较直观
import datetime as dt   # 还是datetime模块导入,但是给datetime取了一个别名dt,通过dt代表了datetime
# 通过这样的改变,让我们后续无需再写[datetime.] --> [模块名.]的方式------改进的写法

# 先构造 datetime 变量
date1 = dt.datetime(2006,12,14)
date2 = dt.datetime(2025,12,14)
print(date2 - date1)    # 结果完全一样

# 判断星期几、格式化硬件打印时间戳......

2.3.3 英文文档看不懂的问题

像上面这样,Python文档是国外的网站,搜索起来太慢了,等不及怎么办?

这样虽然也能找到,但是搜索不方便,而且太慢了------

我们下载Python时候就顺带下载的离线模式的Python文档,可以快速查找,缺点就是:这个离线文档全是英文!

2.4 代码示例:字符串操作

字符串是Python的内置类型,字符串的很多方法不需要导入额外的模块,即可直接使用。

2.4.1 剑指offer 58:翻转单词顺序

力扣链接:剑指offer 58:翻转单词顺序

2.4.1.1 理论

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"l am a student.",则输出"student.aamI"。

  • 使用strsplit方法进行字符串切分,指定空格为分隔符,返回结果是一个列表。
  • 使用列表的reverse方法进行逆序。
  • 使用strjoin方法进行字符串拼接------把列表中的内容进行合并。
2.4.1.2 答案参考
python 复制代码
def reverseWords(s):
    tokens = s.split()
    tokens.reverse()
    return ' '.join(tokens)
    
print(reverseWords('I am a student.'))
2.4.1.3 最佳实践
python 复制代码
# 代码示例:字符串操作

# 代码案例:单词逆序(剑指offer中的题目)
# 剑指offer:是一本包含很多算法题的书!
# 每个参加秋招的同学都至少把这本书刷个两遍!很多面试官出算法题就是从这本书里找的!
# 如果真的遇到了原题,千万不要表现出来!这时候就到了考验演技的时候了!
# 可以多"思考"一下,读读题,不要一口气写完,停顿一下

# 题目:怎样区分的单词?根据空格来分割
# 在Python中,思路是这样的:
# 1、针对上述字符串,使用空格进行划分
# 字符串 split 方法,可以指定分隔符,把字符串分成多个部分,放到一个 list 里
# 2、针对刚才的切分结果列表,进行逆序(reverse方法)
# 3、再把逆序后的列表,组合起来(join,并且可以在组合指定分隔符为1个空格)

def reverseWords(s:str):    # s:[类型声明],这样下面就有提示了(变量有了类型声明之后)
    tokens = s.split(' ')  # 没有代码提示:是因为Python是动态类型的语言,所以我们写s的时候,
    # 其实Pycharm是不知道s是什么类型的,不知道是啥类型,也就不知道有哪些方法,
    # 所以s.spilt到底能不能调用,以及有没有其它方法,这是不好确定的
    tokens.reverse()    # 逆序
    return ' '.join(tokens) # 借助空格分隔符,把这里的字符串重新拼接成一个更长的字符串

# 输入一个字符串,运行程序
print(reverseWords("I am a student."))

2.4.2 leetcode 796:旋转字符串

力扣链接:leetcode 796:旋转字符串

2.4.2.1 理论

给定两个字符串,s和goal。如果在若干次旋转操作之后,s能变成goal,那么返回true
s的旋转操作就是将s最左边的字符移动到最右边。

例如,若s='abcde',在旋转一次之后结果就是'bcdea'

  • 使用len方法求字符串的长度.如果长度不相同,则一定不能旋转得到。
  • s和自己进行拼接,然后直接使用in方法来判定goal是否是s+s的子串。
2.4.2.2 参考答案
python 复制代码
def rotateString(s, goal):
    return len(s) == len(goal) and goal in s + s
    
print(rotateString('abcde', 'cdeab'))
2.4.2.3 最佳实践
python 复制代码
# 代码案例:旋转字符串
# 题目要求
# 如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true
# s = "abcde"   "bcdea"     "cdead"     "deabc"     "eabcd"(s通过旋转能得到的内容)
# 把最左侧的字符,给放到最右侧去!
# s + s => "abcdeabcde" # 每个旋转后得到的字符串都可以在这样一个大字符串中找到

def rotateString(s, goal):
    if len(s) != len(goal):
        return False
    return goal in (s + s)  # in判断某个字符串是否是另外一个字符串的子串

print(rotateString("abcde","cdeab"))
print(rotateString("abcde","edcba"))

2.4.3 leetcode 2255:统计是给定字符串前缀的字符串数目

力扣链接:leetcode 2255:统计是给定字符串前缀的字符串数目

2.4.3.1 理论

给你一个字符串数组words和一个字符串s,其中words[i]s只包含小写英文字母。

请你返回words中是字符串s前缀的字符串数目。

一个字符串的前缀是出现在字符串开头的子字符串。子字符串是一个字符串中的连续一段字符序列。

  • 依次遍历words中的字符串。
  • 直接使用字符串的startswith方法即可判定当前字符串是否是s的前缀。
2.4.3.2 参考答案
python 复制代码
def countPrefixes(words, s):
    res = 0   # 符合要求字符串个数
    for word in words:
        if s.startswith(word):
            res += 1
    return res
    
print(countPrefixes(["a","b","c","ab","bc","abc"], "abc"))
2.4.3.3 最佳实践
python 复制代码
# 代码案例:统计字符串前缀
# 遍历 words,取出每个字符串,判定当前这个字符串是否是 s 的前缀即可(s是否是以这个字符串开题的)

def countPrefixes(words: list,s: str):
    count = 0
    for word in words:
        if s.startswith(word):  # 使用 in 操作可以判断 word 是不是 s 的一部分
            # s 是以 word 开头
            count += 1
    return count    # 注意缩进

print(countPrefixes(['a','b','c','ab','bc','abc'],'abc'))
print(countPrefixes(['a','a'],'aa'))

2.4.4 其它字符串操作

关于字符串的更多操作,参考官方文档:查看文档中的字符串操作

2.5 代码示例:文件查找工具

2.5.1 理论

指定一个待搜索路径,同时指定一个待搜索的关键字。

在待搜索路径中查找是否文件名中包含这个关键字------

  • 使用os.walk即可实现目录的递归遍历。

  • os.walk返回一个三元组,分别是当前路径当前路径下包含的目录名(多个),当前路径下包含的文件名(多个)

python 复制代码
import os

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

for dirpath, dirnames, filenames in os.walk(inputPath):
    for f in filenames:
        if pattern in f:
            print(f'{dirpath}/{f}')

2.5.2 最佳实践

python 复制代码
# 文件搜索工具

# 很多目录,很多文件,想找到某个文件,就不太容易
# 文件搜索工具------如everything

# 实现文件查找工具
# 输入要查找的路径,输入要搜索的文件名(一部分)
# 自动地在指定的路径进行查找
# import os
#
# inputPath = input('请输入要搜索的路径:')
# pattern = input('请输入要搜索的关键词:')

# 递归查找,遇到子目录,就进到目录里面进行查找
#OS.walk(OS:操作系统),只需要使用简单的循环就可以完成递归遍历的过程,就不必手写递归代码了
# for dirpath,dirnames,filenames in os.walk(inputPath):
#     print('----------------------------')
#     print(f'dirpath = {dirpath}')
#     print('dirnames:')
#     for name in dirnames:
#         print(name)
#     print('filename:')
#     for name in filenames:
#         print(name)

# dirpath: 遍历到当前位置,对应的路径是啥
# dirnames: 当前目录下,都有哪些目录,是一个列表,可以包含多个目录名
# filenames: 当前目录下,都有哪些文件名,是一个列表,可以包含多个文件名
# os.walk: os.walk 每次调用都能自动的去针对子目录进行递归的操作,只需要使用上述循环就可以把所有的路径都获取出来

# 正式实现一下这里的功能
import os

inputPath = input('请输入要搜索的路径:')
pattern = input('请输入要搜索的关键词:')

for dirpath,_,filenames in os.walk(inputPath):
    for f in filenames:
        if pattern in f:
            print(f'{dirpath}/{f}')
# 这里只是一个简单粗暴的遍历,比不了 everything,不算特别高效


2.5.3 其它os模块操作

关于os模块的更多操作,参考官方文档:文档中的更多os操作

3 ~> 第三方库

3.1 认识第三方库

第三方库就是别人已经实现好了的库,我们可以拿过来直接使用。

虽然标准库已经很强大了,但是终究是有限的;而第三方库可以视为是集合了全世界Python程序猿的智慧,可以说是几乎无穷无尽。

问题来了,当我们遇到一个需求场景的时候,如何知道,该使用哪个第三方库呢?

这时候就需要用到下面几个网站了:

当我们确定了该使用哪个第三方库之后,就可以使用pip来安装第三方库了。

3.2 使用pip

3.2.1 理论

pip 是 Python 内置的 包管理器

所谓包管理器就类似于我们平时使用的手机app应用商店一样。

第三方库有很多,是不同的人,不同的组织实现的.为了方便大家整理,Python官方提供了一个网站PyPI(PyPI),来收集第三方库。

其他大佬写好的第三方库也会申请上传到PyPI上。

这个时候就可以方便的使用pip工具来下载PyPI上的库了。

pip在我们安装Python的时候就已经内置了,无需额外安装。

pip是一个可执行程序,就在Python的安装目录中。

打开cmd,直接输入pip,如果显示以下帮助信息,说明pip已经准备就绪。

如果最开始按照要求在安装 Python 的时候勾选了这个选项------

那么 pip 就是默认可用的。

如果pip不能使用,说明安装Pycharm时,没有勾选这个选项。

如果提示:

'pip'不是内部或外部命令,也不是可运行的程序

或批处理文件。

则说明没有正确的把pip加入到PATH中,可以手动把pip所在的路径加入到PATH环境变量中(参考这篇文章:windows环境下面配置pip环境变量)。

或者卸载重装Python,记得勾上上述选项,也许是更简单的办法

使用以下命令,即可安装第三方库------

python 复制代码
pip install [库名]

注意: 这个命令需要从网络上下载,使用时要保证网络畅通。

安装成功后,即可使用import导入相关模块,即可进行使用。

注意:如果使用pip安装完第三方库之后,在PyCharm中仍然提示找不到对应的模块,则检查Settings->Project->PythonInterpreter,看当前Python解释器设置的是否正确(如果一个机器上安装了多个版本的Python,容易出现这种情况)。

3.2.2 最佳实践

python 复制代码
# 第三方库(规模远超标准库)

# 认识第三方库
# 代码案例:pip的使用
# pip(Python内置的包管理器)
# 手机app,app其实是来自于不同的厂商------应用商店(下载程序不必找官网啦)
# Python的第三方库也是如此!
# Python官方搞了一个网址 pypi,把各种第三方库给收集起来了!又提供了一个 pip 工具
# 使用 pip 就能直接从 pypi 上面下载你想要的第三方库
# pip 我们视为是 Python 世界中的应用商店
# 安装 Python 的时候已经自动地把 pip 装好了,我们直接就能使用!

# 如何使用 pip 呢?pip是一个命令行程序

# 很多语言都有依赖第三方库

pip效果如下所示,是不是蛮像应用商店的------

像上面这样,说明pip已经安装了,可以使用。

3.3 代码示例:生成二维码

3.3.1 通过搜索引擎,确定使用哪个库

得到情报,qrcode这个库,可以用来生成二维码。

3.3.2 查看 qrcode 文档

在PyPI上搜索qrcode

点击则进入qrcode的详情页。

文档开头描述了如何安装qrcode

页面中央位置描述了 qrcode 库的使用方法。

3.3.3 使用 pip 安装

bash 复制代码
pip install qrcode[pil]

注意:pip安装的时候可能会有警告,提示使用的pip版本太低,这个警告我们不必处理,不影响我们正常使用。

3.3.4 编写代码

按照文档给出的示例,模仿一段代码:

python 复制代码
import qrcode
img = qrcode.make('艾莉丝努力练剑')
img.save('qrcode.png')

运行完毕后,得到结果如下:

使用微信或者其他工具扫码,即可看到二维码内容。

所谓二维码,本质上就是使用黑白点阵表示一个字符串。

我们日常使用的二维码内部一般是一个URL,扫码后会自动跳转到对应的地址,从而打开一个网页。

3.3.5 最佳实践

python 复制代码
# 二维码生成工具

# 二维码本质上就是一段字符串
# 我们可以把任意的字符串,制作成一个二维码图片
# 生活中使用的二维码,更多的是一个URL(网址)

# 标准库里面能不能干这件事情?好像没有这个功能
# 这时候就要看第三方库了------搜索引擎------qrcode

import qrcode

img = qrcode.make('艾莉丝努力练剑!')
# img = qrcode.make('艾莉丝努力练剑!秃秃,新的一周,继续加油吧!艾莉丝会一直支持你哒!')
img.save('qrcode.png')
# no news is good news

3.4 代码示例:操作 excel

3.4.1 理论

读取excel可以使用xlrd模块.文档地址:xlrd

修改excel可以使用xlwt模块.文档地址:xlwt

此处以xlrd为例,演示excel的基本操作。

3.4.2 需求

需求 有如下excel表格d:/test.xlsx

求100班的同学的平均分。

虽然excel自身支持很强大的功能,也可以求和,求平均值,但是如果是稍微复杂的需求,操作起来可能就没那么方便了。

3.4.3 操作

3.4.3.1 安装 xlrd
bash 复制代码
pip install xlrd==1.2.0

注意:此处要指定版本号安装,如果不指定版本号,则安装最新版,最新版里删除了对xlsx格式文件的支持。

3.4.3.2 编写代码
  • 使用open_workbook方法打开一个 excel 文件。
  • 使用xlsx.sheet_by_index(0)获取到 0 号标签页。
  • 使用table.nrows获取到表格的行数。
  • 使用table.cell_value(row, col)获取到表格中row, col位置的元素值。
python 复制代码
import xlrd

# 1. 打开 xlsx 文件
xlsx = xlrd.open_workbook('d:/test.xlsx')
# 2. 获取 0 号标签页. (当前只有一个标签页)
table = xlsx.sheet_by_index(0)
# 3. 获取总行数
nrows = table.nrows
# 4. 遍历数据
count = 0
total = 0
for i in range(1, nrows):
    # 使用 cell_value(row, col) 获取到指定坐标单元格的值.
    classId = table.cell_value(i, 1)
    if classId == 101:
        total += table.cell_value(i, 2)
        count += 1
print(f'平均分: {total / count}')

3.4.4 最佳实践

python 复制代码
# 代码案例:操作excel

# 操作 excel
import  xlrd

# 1、先打开 xlsx 文件
xlsx = xlrd.open_workbook('C:/Users/18106/Desktop/比特课程学习课件/Python/Python:Excel操作.xlsx')
# 2、获取到指定的标签页
table = xlsx.sheet_by_index(0)
# 3、获取到表格中有多少行
nrows = table.nrows
# 4、进行循环统计操作
total = 0
count = 0
for i in range(1,nrows):
    # 拿到当前同学的班级
    classID = table.cell_value(i,1)
    if classID == 100:
        total += table.cell_value(i,2)
        count += 1
print(f'平均分: {total / count}')

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝再次感谢您的阅读!

结语:希望对学习Python相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!

往期回顾

【Python基础:语法第六课】Python文件操作安全指南:告别资源泄露与编码乱码

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
爱打代码的小林7 小时前
python(爬虫selenium)
爬虫·python·selenium
自由生长20247 小时前
Python的私有方法技巧-双下划线开头
python
YDS8297 小时前
SpringCloud —— 配置管理
java·spring·spring cloud
sg_knight7 小时前
设计模式与代码重构
python·设计模式·重构·开发
yugi9878387 小时前
基于C#实现的WiFi信号强度扫描程序
开发语言·c#
元宇宙时间7 小时前
数字人民币助力亚太经合新金融秩序——构建亚太数字经济与区域金融协同的关键基础设施
大数据·人工智能·金融
百***78757 小时前
【保姆级教程】GPT-5.1极速接入指南:3步上手多模态AI能力
大数据·python·gpt·opencv
乂爻yiyao7 小时前
Java 的云原生困局与破局
java·开发语言·云原生
鸿儒5177 小时前
记录一个C++操作8位影像的一个bug
开发语言·c++·bug