当前位置: 首页 > article >正文

10.30Python_异常文件操作json正则

Python异常

  • 作用

    用作信号通知,通知上层调用者有错误产生需要处理

1. try 语句

  • 语法
try:
    可能发生异常的语句块
except 错误类型1 [as 变量名1]:
    异常处理语句块1
except 错误类型2 [as 变量名2]:
    异常处理语句块2
...
except 错误类型n [as 变量名n]:
    异常处理语句块n
except:
    异常处理语句块other
else:
    未发生异常的语句
finally:
    最终的处理语句

  • 作用

    尝试捕获异常,得到异常通知,将程序由异常状态变为正常状态

  • 说明

    except 子句可以有 1个或多个

    except: 不给错误类型,可以匹配全部的错误类型

    else 子句里的语句会在 没有错误发生时执行,当处于异常时不执行

    finally 子句里的语句,无论何时都执行

  • 示例

try:
    x = int(input("请输入一个整数:"))
    print('x=', x)
except ValueError:
    print('您的输入不能转成整数')

print("程序结束")

2. raise 语句

  • 问题

    # 写一个函数, get_score 函数,读取用户输入的整数成绩, 
    # 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间
    # 报 ValueError类型的错误
    def get_score():
        x = int(input('请输入成绩:'))
        if 0 <= x <= 100:
            return x
        raise ValueError
        
    
  • 语法

    raise 异常类型
    或
    raise 异常对象
    
  • 作用

    • 抛出一个错误,让程序进入异常状态
    • 发送错误通知给调用者
  • 示例:

## 写一个函数, get_score 函数,读取用户输入的整数成绩,
## 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间
## 报 ValueError类型的错误
def get_score():
    x = int(input('请输入成绩:'))
    if 0 <= x <= 100:
        return x
    # raise ValueError
    raise ValueError('用户输入的成绩不在 0~100 之间')

try:
    score = get_score()
    print(score)
except ValueError as err:
    print("成绩输入有误 err=", err)

err的作用就是接收raise ValueError(‘用户输入的成绩不在 0~100 之间’)给出的提示信息

  • 异常类型的可选种类

    详见:

    >>> help(__builtins__)
    
  • 课后练习1

    写一个猜拳游戏: 石头,剪刀,布, 
    让电脑随机生成一个,
    你的输入如下:
        0)  石头
        1)  剪刀
        2)  布
        q)  退出
        请选择: 0
       电脑出的是 布 ,你输了
    循环输入,知道输入q 为止
    

    参考答案1

    import random
    import time
    
    signal = ['石头', '剪刀', '布']
    
    def show_menu():
        print(" 0)  石头 ")
        print(" 1)  剪刀 ")
        print(" 2)  布  ")
        print(" q)  退出 ")
    
    def begin_compare(computer, your):
        comp_s = signal[computer]  # 电脑的字符串
        your_s = signal[your]
        print('电脑出的是', comp_s, '你出的是', your_s)
        if comp_s == your_s:
            print('平局!')
        elif comp_s == '石头':
            if your_s == '剪刀':
                print('你输了!')
            elif your_s == '布':
                print('你赢了!')
        elif comp_s == '剪刀':
            if your_s == '布':
                print('你输了!')
            elif your_s == '石头':
                print('你赢了!')
        elif comp_s == '布':
            if your_s == '石头':
                print('你输了!')
            elif your_s == '剪刀':
                print('你赢了!')
        # time.sleep(5)
        input('请输入回车键,继续下一次猜拳:')
    
    def run():
        '''开始猜拳游戏'''
        while True:
            show_menu()
            s = input('请选择:')
            if s == 'q':
                break
            your = int(s)  # 你的选项
            computer = random.randint(0, 2)
            begin_compare(computer, your)
    
    
    if __name__ == '__main__':
        run()
    

    参考答案2

    import random
    import time
    
    signal = ['石头', '剪刀', '布']
    result = ['平局!', '你赢了!', '你输了!']
            #   0         1          -1
    
    # 定义一个二维列表, 行代表 电脑的选择, 列代表我的选择
    map = [
      # 用户: 0  1  2
        [ 0, -1,  1],  # 电脑出的是0---> 石头
        [ 1,  0, -1],  # 电脑出的是1---> 剪刀
        [-1,  1,  0],  # 电脑出的是2---> 布
    ]
    
    def show_menu():
        print(" 0)  石头 ")
        print(" 1)  剪刀 ")
        print(" 2)  布  ")
        print(" q)  退出 ")
    
    def begin_compare(computer, your):
        comp_s = signal[computer]  # 电脑的字符串
        your_s = signal[your]
        print('电脑出的是', comp_s, '你出的是', your_s)
        result_index = map[computer][your]
        r = result[result_index]
        print(r)
        # time.sleep(5)
        input('请输入回车键,继续下一次猜拳:')
    
    def run():
        '''开始猜拳游戏'''
        while True:
            show_menu()
            s = input('请选择:')
            if s == 'q':
                break
            your = int(s)  # 你的选项
            computer = random.randint(0, 2)
            begin_compare(computer, your)
    
    
    if __name__ == '__main__':
        run()
    
  • 课后练习2

    写一个猜数字游戏 让电脑随机生成一个 0 ~ 100 的整数让用来猜
    如果 您输入的数大于电脑生产的数,提示:“您猜大了”, 继续猜
    如果 您输入的数小于电脑生产的数,提示:“您猜小了”, 继续猜
    当 您输入的数等于电脑生产的数,提示:"恭喜您猜对了" 打印猜的次数后退出程序
    

    参考答案

    import random
    
    def run():
        # 1. 让电脑生成一个整数,用 x 变量绑定
        x = random.randint(0, 100)
        count = 0  # 记次数
        while True:
            y = int(input('请输入: '))
            count += 1
            if y > x:
                print('您猜大了!')
            elif y < x:
                print('您猜小了!')
            else:
                print('恭喜您猜对了!')
                break
        print('您共猜了', count, '次')
    
    if __name__ == '__main__':
        run()
    

3.Python全部的错误类型

错误类型说明
ZeroDivisionError除(或取模)零 (所有数据类型)
ValueError传入无效的参数
AssertionError断言语句失败
StopIteration迭代器没有更多的值
IndexError序列中没有此索引(index)
IndentationError缩进错误
OSError输入/输出操作失败
ImportError导入模块/对象失败
NameError未声明/初始化对象 (没有属性)
AttributeError对象没有这个属性
GeneratorExit生成器(generator)发生异常来通知退出
TypeError对类型无效的操作
KeyboardInterrupt用户中断执行(通常是输入^C)
OverflowError数值运算超出最大限制
FloatingPointError浮点计算错误
BaseException所有异常的基类
SystemExit解释器请求退出
Exception常规错误的基类
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
EOFError没有内建输入,到达EOF 标记
EnvironmentError操作系统错误的基类
WindowsError系统调用失败
LookupError无效数据查询的基类
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python 解释器不是致命的)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxError Python语法错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
以下为警告类型
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告

详见:help(builtins)

课后练习

写一个函数 get_age() 用来获取一个人的年龄信息
    此函数规定用户只能输入1~140之间的整数,如果用户输入其它的数则直接触发ValueError类型的错误!

def get_age():
    ...
try:
    age = get_age()
    print("用户输入的年龄是:", age)
except ValueError as err:
    print("用户输入的不是1~140的整数,获取年龄失败!")

参考答案

def get_age():
    age = int(input('请输入: '))
    if age < 0 or age > 140:
        raise ValueError("年龄范围错误")
    return age

Python文件操作

文件操作是Python中常见的任务之一,用于创建、读取、写入和管理文件。以下是一些常见的文件操作任务的思路、总结和示例代码:

1. 打开文件

要执行文件操作,首先需要打开文件。使用open()函数可以打开文件,指定文件名以及打开模式(读取、写入、追加等)。

# 打开一个文本文件以读取内容
file = open("example.txt", "r")

2. 读取文件

一旦文件被打开,可以使用不同的方法来读取文件内容。

# 读取整个文件内容
content = file.read()

# 逐行读取文件内容
for line in file:  #直接遍历文件对象,每次读取一行。这种方式更内存友好,因为不需要将所有行读入内存。
    print(line)
with open('example.txt', 'r') as file:
    lines = file.readlines() # 读取文件的所有行,并将其作为一个列表返回。
    for line in lines:
        print(line, end='') 代码和file = open("example.txt", "r")for line in file:
    print(line) 代码的区别

3. 写入文件

要写入文件,需要打开文件以写入模式(‘w’),然后使用write()方法。

# 打开文件以写入内容
file = open("example.txt", "w")

# 写入内容
file.write("这是一个示例文本。")

4. 关闭文件

完成文件操作后,应该关闭文件,以释放资源和确保文件的完整性。

file.close()

5. 使用with

更安全的方法是使用with语句,它会自动关闭文件。

with open("example.txt", "r") as file:
    content = file.read()
    # 文件自动关闭

6. 检查是否存在

可以使用os.path.exists()来检查文件是否存在。

import os

if os.path.exists("example.txt"):
    print("文件存在")

7. 处理异常

在文件操作中,可能会出现各种异常情况,例如文件不存在或没有权限。在文件操作中捕获这些异常是个好习惯。

try:
    with open("example.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("文件不存在")
except Exception as e:
    print(f"发生错误:{e}")

这些是文件操作的一些常见思路和示例代码。请根据你的具体需求和场景来调整代码。在进行文件操作时,要确保小心处理文件,以避免意外数据损坏或文件损坏。

除了打开、读取和写入文件之外,还有一些其他常见的文件操作,如复制、删除和改变文件名。以下是这些操作的思路和示例代码:

8. 复制文件

要复制文件,你可以使用shutil模块的copy方法。

import shutil

source_file = "source.txt"
destination_file = "destination.txt"

shutil.copy(source_file, destination_file)

9. 删除文件

要删除文件,可以使用os模块的remove方法。

import os

file_to_delete = "file_to_delete.txt"

if os.path.exists(file_to_delete):
    os.remove(file_to_delete)
    print(f"{file_to_delete} 已删除")
else:
    print(f"{file_to_delete} 不存在")

10. 修改名称

要改变文件名,可以使用os模块的rename方法。

import os

old_name = "old_name.txt"
new_name = "new_name.txt"

if os.path.exists(old_name):
    os.rename(old_name, new_name)
    print(f"文件名已更改为 {new_name}")
else:
    print(f"{old_name} 不存在")

Python JSON 数据解析

JSON(JavaScript Object Notation)是一种轻量级数据交换格式,它易于阅读和编写,同时也易于机器解析和生成。Python提供了内置的JSON模块,用于处理JSON数据。

1. 导入模块

import json

2. 序列化

import json
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

json_str = json.dumps(data)  # json.dumps() 是 Python 的 json 模块中的一个函数,它的作用是将 Python 对象转换为 JSON 格式的字符串。
print(json_str)

3. 反序列化

json_str = '{"name": "John", "age": 30, "city": "New York"}'

data = json.loads(json_str) # json.loads() 是 Python json 模块中的一个函数,它的作用是将 JSON 格式的字符串转换为 Python 对象。
print(data)

4. 对象存文件

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

with open('data.json', 'w') as json_file:
    json.dump(data, json_file)

5. 从文件加载

with open('data.json', 'r') as json_file:
    data = json.load(json_file)
    print(data)

6. 嵌套JSON数据

如果JSON数据包含嵌套结构,您可以使用递归来访

问和修改其中的值。

json_data = {
    "name": "Alice",
    "info": {
        "age": 25,
        "location": "Paris"
    }
}

# 获取嵌套的值
age = json_data["info"]["age"]

# 修改嵌套的值
json_data["info"]["location"] = "New York"

# 将更改后的数据转换为JSON字符串
new_json_str = json.dumps(json_data)

7. JSON中列表

JSON可以包含列表,可以使用索引来访问列表元素。

json_data = {
    "fruits": ["apple", "banana", "cherry"]
}

# 获取列表中的第一个水果
first_fruit = json_data["fruits"][0]

# 添加一个新水果到列表
json_data["fruits"].append("orange")

8. JSON中空值

JSON允许表示空值(null),在Python中,它通常转换为None

json_data = {
    "value": None
}

字典和JSON格式不同之处

  1. 数据类型限制
    • JSON:支持的数据类型包括对象(类似于字典)、数组(类似于列表)、字符串、数字、布尔值和 null。JSON 不支持 Python 特有的数据类型如 tuplesetbytes 等。
    • Python 字典:可以包含多种 Python 特有的数据类型,比如 tuplesetbytes 等。
  2. 格式要求
    • JSON:数据必须以字符串的形式表示,键必须是双引号括起来的字符串,值可以是字符串、数字、布尔值、数组、对象或 null
    • Python 字典:键可以是任意不可变的类型(如字符串、数字、元组),值可以是任意类型。键通常用单引号或双引号括起来,但 Python 允许在字典中使用不加引号的键。

Python正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。正则表达式在网络爬虫、数据分析中有着广泛使用,掌握正则表达式能够达到事半功倍的效果。

模式描述
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{n}匹配n个前面表达式。例如,"o{2}“不能匹配"Bob"中的"o”,但是能匹配"food"中的两个o。
re{n,}精确匹配n个前面表达式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等价于"o+”。"o{0,}“则等价于"o*”。
re{n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
|匹配a或b
(re)匹配括号内的表达式,也表示一个组
(?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)类似 (…), 但是不表示一个组
(?imx: re)在括号中使用i, m, 或 x 可选标志
(?-imx: re)在括号中不使用i, m, 或 x 可选标志
(?#…)注释.
(?= re)前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功。
(?> re)匹配的独立模式,省去回溯。
\w匹配数字字母下划线
\W匹配非数字字母下划线
\s匹配任意空白字符,等价于 [\t\n\r\f]。
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9]。
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z匹配字符串结束
\G匹配最后匹配完成的位置。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\n, \t, 等匹配一个换行符。匹配一个制表符, 等
\1…\9匹配第n个分组的内容。
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

1.字符匹配

方法和功能

方法功能
match()判断一个正则表达式是否从开始处匹配一个字符串
search()遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象
findall()遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。如果给出的正则表达式中包含子组,就会把子组的内容单独返回,如果有多个子组就会以元组的形式返回。
finditer()遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回
  • hqyj匹配文本中的hqyj
import re
text="hqyj牛皮6666,hqyj有个老师也牛皮666"
data=re.findall("hqyj",text)
print(data)#['hqyj', 'hqyj']
  • [hqyj]匹配h或者q或者y或者j字符
import re
text="hqyj牛皮6666,hqyj有个老师也牛皮666"
data=re.findall("[hqyj]",text)
print(data)#['h', 'q', 'y', 'j', 'h', 'q', 'y', 'j']
import re
text="hqyj牛皮6666,hqyj有个老师也牛皮666"
data=re.findall("[hqyj]牛",text)
print(data)#['j牛']
  • [^hqyj]匹配除了hqyj以外的其他字符
import re
text="hqyj牛皮6666,hqyj有个老师也牛皮666"
data=re.findall("[^hqyj]",text)
print(data)#['牛', '皮', '6', '6', '6', '6', ',', '有', '个', '老', '师', '也', '牛', '皮', '6', '6', '6']

  • [a-z]匹配a~z的任意字符([0-9]也可以)
import re
text="hqyj牛皮6666,hqyj有个老师abchqyj也牛皮666"
data=re.findall("[a-z]hqyj",text)
print(data)#['chqyj']
  • .匹配除了换行符以外的任意字符
import re
text="hqyj牛皮6666,hqyj有个老师abchqyj也牛皮666"
data=re.findall(".hqyj",text)
print(data)#[',hqyj', 'chqyj']
import re
text="hqyj牛皮6666,hqyj有个老师abchqyj也牛皮666"
data=re.findall(".+hqyj",text) #贪婪匹配(匹配最长的)
print(data)#['hqyj牛皮6666,hqyj有个老师abchqyj']
import re
text="hqyj牛皮6666,hqyj有个老师abchqyj也牛皮666"
data=re.findall(".?hqyj",text)
print(data)#['hqyj', ',hqyj', 'chqyj']

特殊字符

特殊字符含义
\d匹配任何十进制数字;相当于类 [0-9]
\D与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9]
\s匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v]
\S与 \s 相反,匹配任何非空白字符;相当于类 [^ \t\n\r\f\v]
\w匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_]
\W于 \w 相反 (注:re.ASCII 标志使得 \w 只能匹配 ASCII 字符)
\b匹配单词的开始或结束
\B与 \b 相反
  • \w 匹配字母数字下划线(汉字)
import re
text="华清_远见abc 华清hqyj远见 华清牛皮远见"
data=re.findall("华清\w+远见",text)
print(data)#['华清_远见', '华清hqyj远见', '华清牛皮远见']
  • \d匹配数字
import re
text="hqyj66d6 a1h43d3fd43s43d4 "
data=re.findall("d\d",text) # 只匹配一个数字
print(data)#['d6', 'd3', 'd4', 'd4']
import re
text="hqyj66d6 a1h43d3fd43s43d4 "
data=re.findall("d\d+",text)
print(data)#['d6', 'd3', 'd43', 'd4']
  • \s匹配任意空白符 包括空格,制表符等等
import re
text="hqyj666  jack karen 666"
data=re.findall("\sj\w+\s",text)
print(data)#[' jack ']

2.数量控制

*重复0次或者更多次

import re
text="华清远见 华清666远见"
data=re.findall("华清6*远见",text)
print(data)#['华清远见', '华清666远见']

+重复1次或者更多次

import re
text="华清远见 华清666远见 华清6远见"
data=re.findall("华清6+远见",text)
print(data)#['华清666远见', '华清6远见']

?重复1次或者0次

import re
text="华清远见 华清666远见 华清6远见"
data=re.findall("华清6?远见",text)
print(data)#['华清远见', '华清6远见']

{n}重复n次,n是数字

import re
text="华清远见 华清666远见 华清6远见"
data=re.findall("华清6{3}远见",text)
print(data)#['华清666远见']

{n,}重复n次或者更多次

import re
text="华清远见 华清666远见 华清6远见 华清66远见"
data=re.findall("华清6{2,}远见",text)
print(data)#['华清666远见', '华清66远见']

{n,m}重复n到m次

import re
text="华清远见 华清666远见 华清6远见 华清66远见"
data=re.findall("华清6{0,2}远见",text)
print(data)#['华清远见', '华清6远见', '华清66远见']

3.分组

  • ()提取兴趣区域
import re
text="谢帝谢帝,我要迪士尼,我的电话号码18282832341,qq号码1817696843"
data=re.findall("号码(\d{10,})",text)
print(data)#['18282832341', '1817696843']
import re
text="谢帝谢帝,我要迪士尼,我的电话号码18282832341,qq号码1817696843"
data=re.findall("(\w{2}号码(\d{10,}))",text)
print(data)#['18282832341', '1817696843']
  • (|)提取兴趣区域(| = or)
import re
text="第一名张三 第一名物理149分 第一名数学150分 第一名英语148分 第一名总分740分"
data=re.findall("第一名(\w{2,}|\w{2,}\d{2,}分)",text)
print(data)#['张三', '物理149分', '数学150分', '英语148分', '总分740分']

4.开始和结束

  • ^开始
import re
text = "hqyj66abc hqyj123"
data = re.findall("^hqyj\d+", text)
print(data)  #['hqyj66']
  • $结尾
import re
text = "hqyj66abc hqyj123"
data = re.findall("hqyj\d+$", text)
print(data)  #['hqyj123']

5.特殊字符

由于正则表达式中* . \ {} () 等等符号具有特殊含义,如果你指定的字符正好就是这些符号,需要用\进行转义

import re
text = "数学中集合的写法是{2}"
data = re.findall("\{2\}", text)
print(data)  #['{2}']

6.re模块的常用方法

re.findall

获取匹配到的所有数据

import re
text="hqyj66d6 a1h43d3fd43s43d4 "
data=re.findall("d\d+",text)
print(data)#['d6', 'd3', 'd43', 'd4']

re.match

从字符串的起始位置匹配,成功返回一个对象否则返回none。

匹配成功返回对象,对象的方法:

方法功能
group()返回匹配的字符串
start()返回匹配的开始位置
end()返回匹配的结束位置
span()返回一个元组表示匹配位置(开始,结束)
import re

# 在起始位置匹配,并返回一个包含匹配 (开始,结束) 的位置的元组
print(re.match('www', "www.python.com").span())#(0, 3)
print(re.match('www', "www.python.com").start())#0
print(re.match('www', "www.python.com").end())#3
# 不在起始位置匹配
print(re.match('com', "www.python.com"))# None

re.search

扫描整个字符串并返回第一个成功匹配的字符串。成功返回一个对象否则返回none

import re

# 在起始位置匹配 
print(re.search('www', 'www.hqyj.com').span())#(0, 3)
# 不在起始位置匹配
print(re.search('com', 'www.hqyj.com').span())#(9, 12)

re.sub

替换匹配成功的字符

类似与字符串的replace函数

import re
text = "以前华清远见在四川大学旁边,现在华清远见在西南交大旁边"
data = re.sub("华清远见","北京华清远见科技集团成都中心", text)
print(data)#以前北京华清远见科技集团成都中心在四川大学旁边,现在北京华清远见科技集团成都中心在西南交大旁边

re.split

根据匹配成功的位置对字符串进行分割

import re
text = "python is   very easy"
data = re.split("\s{1,}", text)
print(data)#['python', 'is', 'very', 'easy']

re.finditer

类似findall 但是不会全部返回出来 而是返回迭代器(比如匹配成功了10万个 全部返回就很吃内存了)

import re
text = "python is   very easy"
data = re.findall("\w+", text)
print(data)#['python', 'is', 'very', 'easy']
import re
text = "python is   very easy"
data = re.finditer("\w+", text)
print(data)
for el in data:
    print(el.group())

7.常见的一些正则

QQ号:[1 - 9][0 - 9]{4, }(腾讯QQ号从10000开始)
帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
身份证号(15位、18位数字):^\d{15}|\d{18}$
短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

Python日期和时间

Python 的 time 模块下有很多函数可以转换

  • 常见日期格式。

time 模块时间处理的和转换时间格式的常用API: [官网链接](time — 时间访问和转换 — Python 3.12.2 文档)

time.time() - 获取当前时间的时间戳(以秒为单位,浮点数形式,精确到小数点后若干位)

import time  # 引入time模块

ticks = time.time()
print ("当前时间戳为:", ticks)#时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX和Windows只支持到2038年

time.sleep(secs) - 让程序暂停执行指定秒数。

import time

# 让程序暂停3秒
time.sleep(3)
print("3秒后执行到这里...")

time.ctime(timestamp=None) - 将时间戳转换为易读的本地时间格式。

import time

# 获取当前时间的ctime格式
current_time = time.ctime()
print("当前时间 (ctime):", current_time)

# 或者使用特定时间戳
timestamp = 1647708000  # 这是一个示例时间戳
converted_time = time.ctime(timestamp)
print("时间戳转ctime格式:", converted_time)

time.localtime([secs]) - 将时间戳转换为本地时区的struct_time元组。

import time

# 获取当前时间的struct_time元组
local_time_tuple = time.localtime()
print("当前时间 (struct_time):", local_time_tuple)

# 或者使用特定时间戳
timestamp = time.time()
converted_tuple = time.localtime(timestamp)
print("时间戳转struct_time:", converted_tuple)

time.strftime(format[, t]) - 格式化本地时间。

import time

# 获取当前时间并格式化为“年-月-日 时:分:秒”
formatted_time = time.strftime('%Y-%m-%d %H:%M:%S')
print("格式化当前时间:", formatted_time)

# 使用特定时间戳
timestamp = time.time()
custom_format = time.strftime("%Y%m%d_%H%M%S", time.localtime(timestamp))
print("格式化后的时间戳:", custom_format)

格式化符号:

  • %y 两位数的年份表示(00-99)
  • %Y 四位数的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月内中的一天(0-31)
  • %H 24小时制小时数(0-23)
  • %I 12小时制小时数(01-12)
  • %M 分钟数(00=59)
  • %S 秒(00-59)
  • %a 本地简化星期名称
  • %A 本地完整星期名称
  • %b 本地简化的月份名称
  • %B 本地完整的月份名称
  • %c 本地相应的日期表示和时间表示
  • %j 年内的一天(001-366)
  • %p 本地A.M.或P.M.的等价符
  • %U 一年中的星期数(00-53)星期天为星期的开始
  • %w 星期(0-6),星期天为星期的开始
  • %W 一年中的星期数(00-53)星期一为星期的开始
  • %x 本地相应的日期表示
  • %X 本地相应的时间表示
  • %Z 当前时区的名称
  • %% %号本身

属性(time模块本身没有属性,但可以通过其提供的函数生成的对象来访问属性)

对于struct_time对象(由time.localtime()或time.gmtime()等返回),它是一个元组,可以按索引访问各个时间元素:

属性
tm_year
tm_mon月:1 到 12
tm_mday日:1 到 31
tm_hour时:0 到 23
tm_min分:0 到 59
tm_sec秒:0 到 61 (60或61 是闰秒)
tm_wday星期:0 到 6 (0是周一)
tm_yday一年中的第几天,1 到 366
tm_isdst是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1
import time

local_time = time.localtime()

# 访问struct_time的属性(索引)
year = local_time.tm_year
month = local_time.tm_mon
day = local_time.tm_mday
hour = local_time.tm_hour
minute = local_time.tm_min
second = local_time.tm_sec
print(f"当前日期和时间:{year}-{month}-{day} {hour}:{minute}:{second}")

Python网络

Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。

使用 requests 发送 HTTP 请求需要先下载并导入 requests 模块:

import requests

# 导入 requests 包
import requests
response = requests.get('https://www.baidu.com')# 发送请求
print(response.content)  # 获取响应内容


response2 = requests.get('http://localhost:7001/test')# 发送请求
print(response2.json())  # 获取json数据并解析

每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息,如状态码、响应头、响应内容等:

response的属性或方法说明
apparent_encoding编码方式
close()关闭与服务器的连接
content返回响应的内容,以字节为单位
cookies返回一个 CookieJar 对象,包含了从服务器发回的 cookie
elapsed返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
encoding解码 r.text 的编码方式
headers返回响应头,字典格式
history返回包含请求历史的响应对象列表(url)
is_permanent_redirect如果响应是永久重定向的 url,则返回 True,否则返回 False
is_redirect如果响应被重定向,则返回 True,否则返回 False
iter_content()迭代响应
iter_lines()迭代响应的行
json()返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误)
links返回响应的解析头链接
next返回重定向链中下一个请求的 PreparedRequest 对象
ok检查 “status_code” 的值,如果小于400,则返回 True,如果不小于 400,则返回 False
raise_for_status()如果发生错误,方法返回一个 HTTPError 对象
reason响应状态的描述,比如 “Not Found” 或 “OK”
request返回请求此响应的请求对象
status_code返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
text返回响应的内容,unicode 类型数据
url返回响应的 URL

requests的方法

方法描述
delete(url, args)发送 DELETE 请求到指定 url
get(url, params, args)发送 GET 请求到指定 url
head(url, args)发送 HEAD 请求到指定 url
patch(url, data, args)发送 PATCH 请求到指定 url
post(url, data, json, args)发送 POST 请求到指定 url
put(url, data, args)发送 PUT 请求到指定 url
request(method, url, args)向指定的 url 发送指定的请求方法

requests.get(url, params ={key: value}, args)

  • url 请求 url。
  • **params ** 参数为要发送到指定 url 的 JSON 对象。
  • args 为其他参数,比如 cookies、headers、verify等。
import requests

# 图片URL地址
image_url = 'http://localhost:7001/public/1.png'

# 发送GET请求获取图片数据
response = requests.get(image_url)

# 检查请求是否成功(HTTP状态码为200)
if response.status_code == 200:
    # 将图片数据写入本地文件
    with open('image.jpg', 'wb') as f:
        f.write(response.content)
    print("图片已成功下载并保存为 image.jpg")
else:
    print(f"无法下载图片,响应状态码:{response.status_code}")

requests.post(url, data={key: value}, json={key: value}, args)

  • url 请求 url。
  • data 参数为要发送到指定 url 的字典、元组列表、字节或文件对象。
  • json 参数为要发送到指定 url 的 JSON 对象。
  • args 为其他参数,比如 cookies、headers、verify等。
import requests
headers = {'User-Agent': 'Mozilla/5.0'}  # 设置请求头
params = {'key1': 'value1', 'key2': 'value2'}  # 设置查询参数
data = {'username': 'jack', 'password': '123456'}  # 设置请求体
response = requests.post('http://localhost:7001/test', headers=headers, params=params, data=data)
print(response.text)

http://www.kler.cn/a/373176.html

相关文章:

  • 论文检索与写作1
  • 阿里云物联网的通信方式
  • 【解决方案】微信小程序如何使用 ProtoBuf 进行 WebSocket 通信
  • 一七一、React性能优化方式
  • ★ Linux ★ 基础开发工具的使用(上)
  • JAVA多线程--CAS补充
  • 12. MapReduce全局计数器
  • Vue3实现地球上加载柱体
  • 如何将 Excel 数据转换为 SQL 脚本:从入门到实战
  • C# 将批量图片转为PDF文件
  • ts:模块导入、导出的简单使用(export、import)
  • 【Vue3】第二篇
  • 2024年“炫转青春”山东省飞盘联赛盛大开赛——临沭县青少年飞盘运动迅速升温
  • 文本分段Chunking综述-RAG
  • 解决:如何在opencv中得到与matlab立体标定一样的矫正图?(python版opencv)
  • 【无人机设计与控制】红嘴蓝鹊优化器RBMO求解无人机路径规划MATLAB
  • R变量索引 - 什么时候使用 @或$
  • webrtc agc2实现原理
  • 高通 Android 12 首次安装去掉下拉弹窗
  • 书生实战营第四期-第三关 Git+InternStudio
  • MATLAB人脸考勤系统
  • ROS2入门学习——ROS1与ROS2区别
  • Unity XR Interaction Toolkit 开发教程(2):导入 SDK【3.0 以上版本】
  • 前缀和算法 | 计算分矩阵的和
  • 安卓开发之数据库的创建与删除
  • Ajax:跨域 JSONP