【Python高级编程】新手小白必须得学会的文本文件操作,资料资源均可分享!

文件读取处理

  • 使用 read():
# 使用 'read' 方法读取文件的所有内容
with open('resources/training_log.txt', 'r') as file:
         content = file.read()
         print(content)
         
# 报错处理版本
# 使用 'read' 方法读取文件的所有内容
# 使用 'utf-8' 编码方式打开文件
with open('resources/training_log.txt', 'r', encoding='utf-8') as file:
         content = file.read()
         print(content)
         
运行效果:
    俺啥都奥多拉拉飞机
    秦时明月汉时关,
    万里长征人未还。
    但使龙城飞将在,
    不教胡马度阴山。
  • 使用readline() 逐行读取文件:
# 使用 'readline' 方法逐行读取文件
with open('resources/training_log.txt', 'r') as file:
line = file.readline()
print(line)
while line:
             print(line, end='')
             line = file.readline()
运行效果:
    俺啥都奥多拉拉飞机
    ​
    俺啥都奥多拉拉飞机
    秦时明月汉时关,
    万里长征人未还。
    但使龙城飞将在,
    不教胡马度阴山。
  • 使用 readlines 读取多行信息,会将所有信息拼接成一个列表:
# 使用 'readlines' 方法读取文件的所有行
with open('resources/training_log.txt', 'r') as file:
lines = file.readlines()
        print(lines)
        for line in lines:
            print(line, end='')
            
运行效果:
    ['俺啥都奥多拉拉飞机\n', '秦时明月汉时关,\n', '万里长征人未还。\n', '但使龙城飞将在,\n', '不
    教胡马度阴山。']
    俺啥都奥多拉拉飞机
    秦时明月汉时关,
    万里长征人未还。
    但使龙城飞将在,
    不教胡马度阴山。

文件写入处理

  • 使用 write() 方法写入文件:
    # 使用 'write' 方法写入文件
    with open('resources/example_1.txt', 'w') as file:
         file.write("Hello, World!")
       
    运行效果:
    resources目录下多了一个example_1.txt文件,内容为 “Hello, World!” 
  • 使用 ‘writelines’ 方法写入多行文件:
    # 使用 'writelines' 方法写入多行文件
    lines = ["Hello, World!", "Welcome to Python programming."]
    with open('resources/example_2.txt', 'w') as file:
        file.writelines(line + '\n' for line in lines)
        
    运行效果:
    resources目录下多了一个example_2.txt文件,内容为
    Hello, World!
    Welcome to Python programming.

日志文件读写

  • 写一段代码,模拟生成 accurary 逐步上升、loss 逐步下降的训练日志,并将日志信息记录到 training_log.txt 中:
import random
​
# 定义训练轮数、准确率和损失
epoch = 100
accuracy = 0.5
loss = 0.9# 打开文件并写入表头
with open('training_log.txt', 'w') as f:
    # 第一行内容
    f.write('Epoch\tAccuracy\tLoss\n')# 循环训练
    for epoch_i in range(1, epoch+1):
        # 随机更新准确率和损失
        # random.uniform 随机数,参数为随机数范围
        accuracy += random.uniform(0, 0.005)
        loss -= random.uniform(0, 0.005)# 确保准确率在0到1之间,损失在0到1之间
        accuracy = min(1, accuracy)
        loss = max(0, loss)# 将训练信息写入文件
        # :.3f 保留小数点后三位
        f.write(f'{epoch_i}\t{accuracy:.3f}\t{loss:.3f}\n')# 打印当前训练信息
        print(f'Epoch:{epoch_i}, Accuracy:{accuracy}, Loss:{loss}')
        
运行结果:
Epoch:1, Accuracy:0.501179283434492, Loss:0.8968876573254405
Epoch:2, Accuracy:0.5012701446173562, Loss:0.892587190207276  
Epoch:3, Accuracy:0.5015028116406762, Loss:0.8908834919247945 
Epoch:4, Accuracy:0.5058295280112071, Loss:0.8885752496845984 
Epoch:5, Accuracy:0.5107747387348778, Loss:0.8875305056385812 
Epoch:6, Accuracy:0.5134465523544417, Loss:0.8859972537197854 
Epoch:7, Accuracy:0.5146851947399464, Loss:0.8814020451165393 
Epoch:8, Accuracy:0.5154084829391488, Loss:0.8766349678804274 
Epoch:9, Accuracy:0.518524659425188, Loss:0.8735754670347503  
Epoch:10, Accuracy:0.5200278427804359, Loss:0.8711413616408478
生成 training_log.txt 文件内容为
Epoch   Accuracy    Loss
1   0.501   0.897
2   0.501   0.893
3   0.502   0.891
4   0.506   0.889
5   0.511   0.888
6   0.513   0.886
7   0.515   0.881
8   0.515   0.877
9   0.519   0.874
10  0.520   0.871

pandas 表格数据处理

  • 安装 pandas
pip install pandas
# 清华源来安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
  • 安装 openpyxl
pip install openpyxl
# 清华源来安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl

pandas表格读取与数据处理

  • 读取 csv 表格文件
    import pandas as pd
    ​
    data_loc = r'./resources/yolov5s.csv'
    data = pd.read_csv(data_loc)
    print(data)
    ​
运行结果:
                 epoch  train/box_loss  ...           x/lr1           x/lr2
    0                0        0.103060  ...        0.000900        0.091900
    1                1        0.076159  ...        0.001810        0.083710
    2                2        0.066722  ...        0.002718        0.075518
    3                3        0.062263  ...        0.003623        0.067323
    4                4        0.057136  ...        0.004524        0.059124
    ..             ...             ...  ...             ...             ...
    95              95        0.026012  ...        0.001080        0.001080
    96              96        0.026545  ...        0.001055        0.001055
    97              97        0.026161  ...        0.001035        0.001035
    98              98        0.026270  ...        0.001020        0.001020
    99              99        0.025782  ...        0.001009        0.001009    
  • 读取 excel 表格
    import pandas as pd
    ​
    data_loc = r'./resources/销售数据.xlsx'
    data = pd.read_excel(data_loc)
    print(data)
    ​
运行结果:
             顾客编号  大类编码 大类名称    中类编码  中类名称      小类编码  ...  商品类型  单位  
     销售数量   销售金额   商品单价 是否促销
    0         0.0  12.0   蔬果  1201.0    蔬菜  120109.0  ...    生鲜   个  8.000   4.00   2.001         1.0  20.0   粮油  2014.0   酱菜类  201401.0  ...  一般商品   袋  6.000   3.00   0.502         2.0  15.0   日配  1505.0  冷藏乳品  150502.0  ...  一般商品   袋  1.000   2.40   2.403         3.0  15.0   日配  1503.0  冷藏料理  150305.0  ...  一般商品   袋  1.000   6.50   8.304         4.0  15.0   日配  1505.0  冷藏乳品  150502.0  ...  一般商品   袋  1.000  11.90  11.90...       ...   ...  ...     ...   ...       ...  ...   ...  ..    ...    ...    ...  ...
    42811  1605.0  12.0   蔬果  1201.0    蔬菜  120106.0  ...    生鲜  千克  0.217   3.91  18.0042812  1572.0  12.0   蔬果  1201.0    蔬菜  120102.0  ...    生鲜  千克  0.440   0.86   1.9642813  1170.0  30.0   洗化  3016.0   纸制品  301603.0  ...  一般商品   提  1.000  12.90  14.5042814  2605.0  12.0   蔬果  1201.0    蔬菜  120101.0  ...    生鲜  千克  0.718   1.84   2.5642815  2610.0  23.0   酒饮  2317.0  进口饮料  231702.0  ...  联营商品   罐  1.000   8.00   8.00
  • 读取 excel 表格 数据,输出头几行信息
    import pandas as pd
    
    data_loc = r'./resources/销售数据.xlsx'
    data = pd.read_excel(data_loc)
    
    headInfo = data.head()
print(headInfo)
    
    运行结果:
       顾客编号  大类编码 大类名称    中类编码  中类名称      小类编码    小类名称        销售日期      销售月份           商品编码    规格型号  商品类型 单位  
    销售数量  销售金额  商品单价 是否促销
    0   0.0  12.0   蔬果  1201.0    蔬菜  120109.0    其它蔬菜  20150101.0  201501.0  DW-1201090311            生鲜  个   8.0   4.0   2.01   1.0  20.0   粮油  2014.0   酱菜类  201401.0      榨菜  20150101.0  201501.0  DW-2014010019     60g  一般商品  袋   6.0   3.0   0.52   2.0  15.0   日配  1505.0  冷藏乳品  150502.0  冷藏加味酸乳  20150101.0  201501.0  DW-1505020011    150g  一般商品  袋   1.0   2.4   2.43   3.0  15.0   日配  1503.0  冷藏料理  150305.0   冷藏面食类  20150101.0  201501.0  DW-1503050035    500g  一般商品  袋   1.0   6.5   8.34   4.0  15.0   日配  1505.0  冷藏乳品  150502.0  冷藏加味酸乳  20150101.0  201501.0  DW-1505020020  100g*8  一般商品  袋   1.0  11.9  11.9
  • 注:head 传入数字几,就表示输出前几行信息
  • 读取 excel 表格 数据,输出尾几行信息
    import pandas as pd
    
    data_loc = r'./resources/销售数据.xlsx'
    data = pd.read_excel(data_loc)
    
    tailInfo = data.tail()
    print(tailInfo)
    
运行结果:
             顾客编号  大类编码 大类名称    中类编码  中类名称      小类编码  小类名称        销售日期      销售月份           商品编码   规格型号  商品类型  单
    位   销售数量   销售金额   商品单价 是否促销
    42811  1605.0  12.0   蔬果  1201.0    蔬菜  120106.0   菌菇类  20150430.0  201504.0  DW-1201060002     散称    生鲜  千克  0.217   3.91  18.0042812  1572.0  12.0   蔬果  1201.0    蔬菜  120102.0    根茎  20150430.0  201504.0  DW-1201020040     散称    生鲜  千克  0.440   0.86   1.9642813  1170.0  30.0   洗化  3016.0   纸制品  301603.0   无芯纸  20150430.0  201504.0  DW-3016030007    10卷  一般商品   提  1.000  12.90  14.5042814  2605.0  12.0   蔬果  1201.0    蔬菜  120101.0    叶菜  20150430.0  201504.0  DW-1201010023     散称    生鲜  千克  0.718   1.84   2.5642815  2610.0  23.0   酒饮  2317.0  进口饮料  231702.0  进口果汁  20150430.0  201504.0  DW-2317020131  490ml  联营商品   罐  1.000   8.00   8.00
  • 读取 excel 表格 数据,定位第一行
import pandas as pd
    ​
    data_loc = r'./resources/销售数据.xlsx'
    data = pd.read_excel(data_loc)
    ​
    data_0 = data.loc[0]
    print(data_0)
    ​
    运行结果:
    顾客编号              0.0
    大类编码             12.0
    大类名称               蔬果
    中类编码           1201.0
    中类名称               蔬菜
    小类编码         120109.0
    小类名称             其它蔬菜
    销售日期       20150101.0
    销售月份         201501.0
    商品编码    DW-1201090311
    规格型号
    商品类型               生鲜
    单位                  个
    销售数量              8.0
    销售金额              4.0
    商品单价              2.0
    是否促销                否
Name: 0, dtype: object
  • 读取 excel 表格 数据,定位指定列
import pandas as pd
    ​
data_loc = r'./resources/销售数据.xlsx'
data = pd.read_excel(data_loc)# 读“大类编码”列的全部值
    data_1 = data.loc[:,"大类编码"]
    print(data_1)
    ​
    运行结果:
    0        12.0
    1        20.0
    2        15.0
    3        15.0
    4        15.0
             ...
    42811    12.0
    42812    12.0
    42813    30.0
    42814    12.0
    42815    23.0
    Name: 大类编码, Length: 42816, dtype: float64
  • 读取 excel 表格 数据,定位指定元素
import pandas as pd
    
data_loc = r'./resources/销售数据.xlsx'
data = pd.read_excel(data_loc)
    
    # 读取第一行,“大类编码”列对应的值
    data_2 = data.loc[1,"大类编码"]
print(data_2)
  
    运行结果:
    20.0  
  • 读取 excel 表格 数据,对行和列进行切片
import pandas as pd  
data_loc = r'./resources/销售数据.xlsx'
data = pd.read_excel(data_loc)
    
# 读取第一行到第三行,“大类编码”列到“中类名称”列这个区域内的值
    data_3 = data.loc[1:3,"大类编码":"中类名称"]
    print(data_3)
    
    运行结果:
       大类编码 大类名称    中类编码  中类名称
    1  20.0   粮油  2014.0   酱菜类
    2  15.0   日配  1505.0  冷藏乳品
    3  15.0   日配  1503.0  冷藏料理
  • 读取 excel 表格 数据,提取符合要求的元素
    import pandas as pd
    ​
    data_loc = r'./resources/销售数据.xlsx'
    data = pd.read_excel(data_loc)# 读取“销售数量”列中大于10的值
    data_4 = data.loc[data["销售数量"]>10]
print(data_4)
    ​
    运行结果:
      顾客编号  大类编码 大类名称    中类编码  中类名称  小类编码    小类名称  ...   规格型号  商品类型  单位
      销售数量   销售金额  商品单价  是否促销
    22       19.0  15.0   日配  1518.0  常温乳品  151805.0   利乐枕纯奶  ...  240ml  一般商品   袋  16.0   33.9   2.751       33.0  15.0   日配  1518.0  常温乳品  151805.0   利乐枕纯奶  ...  240ml  一般商品   袋  16.0   43.2   2.7437     116.0  15.0   日配  1518.0  常温乳品  151813.0  利乐砖乳酸菌  ...   205g  一般商品   盒  12.0   49.0   5.5478      66.0  15.0   日配  1518.0  常温乳品  151807.0  利乐枕营养奶  ...  240ml  一般商品   袋  16.0   44.8   2.8488      86.0  20.0   粮油  2015.0    罐头  201501.0     八宝粥  ...   360g  一般商品   个  12.0   38.4   3.2...       ...   ...  ...     ...   ...  
         ...     ...  ...    ...   ...  ..   ...    ...   ...   ...
    42444  2601.0  15.0   日配  1518.0  常温乳品  151806.0  利乐枕加味奶  ...  230ml  一般商品   袋  16.0   29.9   2.842500  1973.0  15.0   日配  1518.0  常温乳品  151813.0  利乐砖乳酸菌  ...  200ml  一般商品   盒  12.0   58.9   5.342509  1631.0  15.0   日配  1521.0    蛋类  152101.0    新鲜蛋品  ...     散称  一般商品  kg  10.1  141.4  14.042746   421.0  15.0   日配  1505.0  冷藏乳品  150502.0  冷藏加味酸乳  ...   150g  一般商品   袋  15.0   26.9   2.442757    74.0  15.0   日配  1518.0  常温乳品  151803.0  利乐砖营养奶  ...  250ml  一般商品   盒  24.0   79.2   3.3
  • 读取 excel 表格 数据,提取符合要求的元素(切片)
import pandas as pd
    
data_loc = r'./resources/销售数据.xlsx'
data = pd.read_excel(data_loc)
    
# 读取“销售数量”列中大于10,“小类编码”列到“小类名称”列这个区域内的值
data_5 = data.loc[data["销售数量"]>10,["小类编码","小类名称"]]
print(data_5)
    
运行结果:
           小类编码    小类名称
    22     151805.0   利乐枕纯奶   
    51     151805.0   利乐枕纯奶   
    437    151813.0  利乐砖乳酸菌  
    478    151807.0  利乐枕营养奶  
    488    201501.0     八宝粥     
    ...         ...     ...        
    42444  151806.0  利乐枕加味奶
    42500  151813.0  利乐砖乳酸菌
    42509  152101.0    新鲜蛋品
    42746  150502.0  冷藏加味酸乳
    42757  151803.0  利乐砖营养奶
    
    [682 rows x 2 columns]
  • 读取 excel 表格 数据,数据分组和排序
# 导入 Pandas 库并将其重命名为 pd
import pandas as pd
    
    # 定义销售数据文件路径
    data_loc = r'./resources/销售数据.xlsx'
    
    # 使用 Pandas 读取 Excel 文件中的数据,并存储在名为 data 的 DataFrame 中
    data = pd.read_excel(data_loc)
    
    # 按商品类型分组,并计算每个商品类型的销售金额总和
    data_extract = data.groupby('商品类型')['销售金额'].sum()
    
    # 重置索引,将分组后的结果重新设置为 DataFrame,以便后续操作
    data_extract = data_extract.reset_index()
    
    # 打印分组后的结果,包括商品类型和对应的销售金额总和
print(data_extract)
    
    运行结果:
       商品类型    销售金额
    0  一般商品  336529.74
    1    生鲜  111808.70
    2  联营商品    5873.81
  • 读取 excel 表格 数据,将处理好的数据保存成 excel
# 导入 Pandas 库并将其重命名为 pd
import pandas as pd
    
    # 定义销售数据文件路径
    data_loc = r'./resources/销售数据.xlsx'
    
    # 使用 Pandas 读取 Excel 文件中的数据,并存储在名为 data 的 DataFrame 中
    data = pd.read_excel(data_loc)
    
    # 按商品类型分组,并计算每个商品类型的销售金额总和
    data_extract = data.groupby('商品类型')['销售金额'].sum()
    
    # 重置索引,将分组后的结果重新设置为 DataFrame,以便后续操作
    data_extract = data_extract.reset_index()
    
    data_extract.to_csv("处理好的表格.csv",index=False)
    data_extract.to_excel("处理好的表格.xlsx",index=False)
注 :

Matplotlib 常用画图处理

  • 安装 matplotlib
pip install matplotlib
# 清华源来安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
  • numpy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
  • kiwisolver
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple kiwisolver

绘制折线图

  • 曲线图
import numpy as np
import matplotlib.pyplot as plt
    ​
    # 创建一个x值的数组,从-2π到2π,步长为0.01
    x = np.arange(-2 * np.pi, 2 * np.pi, 0.01)# 计算每个x值对应的sin(x)值
    y = np.sin(x)# 使用matplotlib来绘制图像
    plt.figure()  # 创建一个新的图像窗口
    plt.plot(x, y)  # 绘制折线图
    plt.title('sin(x)')  # 设置图像的标题
    plt.xlabel('x')  # 设置x轴的标签
    plt.ylabel('sin(x)')  # 设置y轴的标签
    plt.grid(True)  # 显示网格
    plt.show()  # 显示图像
  • 单折线图
import pandas as pd
import matplotlib.pyplot as plt
    
    # 导入数据集
    data_loc = r'resources/yolov5s.csv'
    data = pd.read_csv(data_loc, index_col=0)
    
    # 提取训练框损失数据
    train_bbox_loss = data['      train/box_loss']
    
    # 创建 x 轴数据
    x_list = [i for i in range(len(train_bbox_loss))]
    
    # 绘制损失曲线图
    plt.plot(x_list, train_bbox_loss)
    plt.xlabel('Epoch')  # 设置 x 轴标签
    plt.ylabel('Loss')   # 设置 y 轴标签
    plt.title('YOLOv5s')  # 设置图表标题
    plt.show()  # 显示图表  
  • 多折线图
import pandas as pd
import matplotlib.pyplot as plt
    
    # 定义文件路径
    file_1_loc = 'resources/yolov5l.csv'
    file_2_loc = 'resources/yolov5m.csv'
    file_3_loc = 'resources/yolov5s.csv'
    
    # 读取数据文件
    file_1 = pd.read_csv(file_1_loc)
    file_2 = pd.read_csv(file_2_loc)
    file_3 = pd.read_csv(file_3_loc)
    
    # 提取训练框损失数据
    file_1_train_box_loss = file_1['      train/box_loss']
    file_2_train_box_loss = file_2['      train/box_loss']
    file_3_train_box_loss = file_3['      train/box_loss']
    
    # 创建 x 轴数据
    x_list = [i for i in range(len(file_1_train_box_loss))]
    
    # 绘制损失曲线
    plt.plot(x_list, file_1_train_box_loss)
    plt.plot(x_list, file_2_train_box_loss)
    plt.plot(x_list, file_3_train_box_loss)
    
    # 设置 x 轴标签
    plt.xlabel("Epoch")
    # 设置 y 轴标签
    plt.ylabel("Loss")
    # 设置图表标题
    plt.title("Train box_loss")
    # 添加网格线
    plt.grid()
    # 添加图例
    plt.legend(['yolov5l', 'yolov5m', 'yolov5s'])
    
    # 显示图表
    plt.show()
  • 绘制散点图
import matplotlib.pyplot as plt
import numpy as np
​
# 创建数据
num_points = 100
x = np.random.rand(num_points)  # x坐标
y = np.random.rand(num_points)  # y坐标
colors = np.random.rand(num_points)  # 每个点的颜色
sizes = 1000 * np.random.rand(num_points)  # 每个点的大小
alphas = np.random.rand(num_points)  # 每个点的透明度# 创建散点图
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')# 显示颜色条
plt.colorbar()# 显示图像
plt.show()
  • 绘制柱状图
import matplotlib.pyplot as plt
import numpy as np
​
# 数据
labels = ['A', 'B', 'C', 'D', 'E']
values = [3, 7, 2, 5, 8]# 设置标签的位置
x = np.arange(len(labels))# 绘制柱状图
plt.bar(x, values, color='blue', align='center', alpha=0.7)# 设置图表的标题和轴标签
plt.title('Simple Bar Chart')
plt.xlabel('Labels')
plt.ylabel('Values')# 设置x轴的标签
plt.xticks(x, labels)# 显示图像
plt.show()
  • 绘制饼状图
import matplotlib.pyplot as plt

# 数据
sizes = [15, 30, 45, 10]  # 各部分的大小
labels = ['A', 'B', 'C', 'D']  # 各部分的标签
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']  # 各部分的颜色
explode = (0.1, 0, 0, 0)  # 突出显示第一个部分,这里的值表示从圆心移出的距离,相对于半径的比例

# 绘制扇形图
plt.pie(
    sizes,                   # 数据大小
    explode=explode,        # 突出显示的部分
    labels=labels,          # 标签
    colors=colors,          # 颜色
    autopct='%1.1f%%',      # 设置百分比显示格式,'%1.1f%%'表示小数点后1位
    shadow=True,            # 是否显示阴影
    startangle=140          # 起始角度,以逆时针为正方向,从x轴正方向逆时针旋转的角度
)

# 设置为等比例,这样扇形图就是一个圆
plt.axis('equal')

# 显示图像
plt.show()

OpenCV 影像数据处理

  • 作用:用于处理图片及视频文件
  • 安装 opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simpleopencv-python==4.5.36

图像数据处理

  • 加载图片和展示图片
import cv2
    ​
    img_path = r'resources/food.png'# 以彩色模式读取图片
    image_color = cv2.imread(img_path)# 以灰度模式读取图片
    image_gray = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    ​
    ​
    # 显示图片
    cv2.imshow('Color Image', image_color)
    # cv2.imshow('Grayscale Image', image_gray)# 等待用户按键,然后关闭窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
注意:
  • imread第二个参数不加会默认以彩色模式展示图片

图片缩放

import cv2
    
    # 读取图片
    image = cv2.imread('resources/food.png')
    
    # 检查图片是否正确加载
    if image is None:
        print("Error: Could not load image.")
        exit()
    
    # 打印图片的形状,即高度、宽度和通道数
    print(image.shape)
    
    # 获取图片的原始尺寸
    original_height, original_width = image.shape[:2]
    
    # 计算新的尺寸(这里将原始尺寸缩小一半)
    new_width = int(original_width / 2)
    new_height = int(original_height / 2)
    
    # 使用cv2.resize进行图片缩放,参数包括原始图片、目标大小、插值方法
    # 第一个参数是原始图像,第二个参数是目标尺寸,第三个参数是插值方法
    # 插值方法决定了如何计算新像素值,常见的插值方法包括INTER_LINEAR和INTER_AREA等
    # 这里使用的是INTER_AREA,适合缩小图像
    resized_image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA)
    
    # 显示原始图片和缩放后的图片
    cv2.imshow('Original Image', image)
    cv2.imshow('Resized Image', resized_image)
    
    # 等待用户按键,然后关闭窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • 图片翻转
import cv2
    
    # 读取图片
    image = cv2.imread('resources/food.png')
    
    # 使用cv2.rotate()函数旋转图片
    # cv2.ROTATE_90_CLOCKWISE表示顺时针旋转90度
    rotated_90 = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
    # cv2.ROTATE_180表示顺时针旋转180度
    rotated_180 = cv2.rotate(image, cv2.ROTATE_180)
    # cv2.ROTATE_90_COUNTERCLOCKWISE表示顺时针旋转270度
    rotated_270 = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
    
    # 显示原始图片以及旋转后的图片
    cv2.imshow('original', image)
    cv2.imshow('90 degree', rotated_90)
    cv2.imshow('180 degree', rotated_180)
    cv2.imshow('270 degree', rotated_270)
    
    # 等待用户按键,然后关闭窗口
    cv2.waitKey(0)
  • 图片保存
import cv2
    
# 读取图像
    image = cv2.imread('resources/food.png')
    
# 如果图像不为空,则保存图像
    if image is not None:
        cv2.imwrite('output_image.png', image)
    else:
        print("无法读取图像")

视频数据处理

  • 视频读取
import cv2
    ​
    # 创建一个 VideoCapture 对象,参数 0 表示使用默认的摄像头, 也可以传入一个视频文件的路径
    cap = cv2.VideoCapture(0)   # resources/piano.mp4while True:
        # 读取一帧
        ret, frame = cap.read()# 如果读取成功,显示这一帧
        if ret:
            cv2.imshow('Frame', frame)# 按 'q' 键退出循环
        # waitKey 设置每一帧画面的时间间隔,单位毫秒
        if cv2.waitKey(15) & 0xFF == ord('q'):
            break# 释放资源并关闭窗口
    cap.release()
    cv2.destroyAllWindows()
  • 视频数据保存
import cv2
    ​
    # 定义视频捕获对象,参数为摄像头设备索引,通常 0 表示默认摄像头
    cap = cv2.VideoCapture(0)# 检查摄像头是否成功打开
    if not cap.isOpened():
        print("Error: Could not open camera.")
        exit()# 获取摄像头的帧宽度和帧高度
    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 定义视频编码器和输出文件,fourcc 参数用于指定视频编码器
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 使用 MP4 编码器
    # 创建一个 VideoWriter 对象,用于将捕获到的视频帧写入到名为 'output.mp4' 的文件中
    # 参数 'output.mp4' 指定了输出视频文件的名称,它将保存在当前工作目录下
    # 参数 fourcc 指定了视频编码器的四字符代码,这里使用 MPEG-4 编码器 ('mp4v')
    # 参数 20.0 指定了输出视频的帧率,即每秒播放的帧数,这里设置为 20 帧每秒
    # 参数 (frame_width, frame_height) 指定了输出视频的帧大小,即摄像头捕获到的帧的宽度和高度
    out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (frame_width, frame_height))# 进入视频捕获循环
    while True:
        # 读取摄像头的帧
        ret, frame = cap.read()
        
        # 如果无法读取帧,则退出循环
        if not ret:
            print("Failed to grab frame.")
            break# 将当前帧写入输出视频文件
        out.write(frame)# 显示当前帧
        cv2.imshow('frame', frame)# 检测按键,如果是 'q' 键则退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break# 释放资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()

综合案例:视频处理

  • 用 OpenCV 打开一段视频,将每一帧画面压缩成 540p,对画面进行垂直翻转,转为黑白,然后添加高斯噪音,把处理好的每一帧画面保存成一个mp4文件
import cv2
import numpy as np
​
def add_gaussian_noise(image):
    # 获取图像的行数和列数
    row, col = image.shape
    # 设置高斯噪声的均值和标准差
    mean = 0
    sigma = 15
    # 生成均值为mean、标准差为sigma的高斯分布噪声
    gauss = np.random.normal(mean, sigma, (row, col))
    # 将噪声叠加到原始图像上
    noisy = image + gauss
    # 将叠加后的图像像素值限制在0到255之间
    noisy_img = np.clip(noisy, 0, 255)
    # 将数据类型转换为无符号8位整数,即图像的像素值范围为0到255
    return noisy_img.astype(np.uint8)# 输入和输出视频文件名
input_video = 'resources/outdoor.mp4'
output_video = 'resources/output.mp4'# 打开输入视频
cap = cv2.VideoCapture(input_video)# 获取视频的帧率和帧大小
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 计算新的帧大小 (540p)
new_height = 540
new_width = int((new_height / frame_height) * frame_width)# 创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_video, fourcc, fps, (new_width, new_height), isColor=False)while True:
    # 读取视频的一帧
    ret, frame = cap.read()
    # 如果无法读取帧(到达视频末尾),则退出循环
    if not ret:
        break# 调整帧大小为新的帧大小
    frame = cv2.resize(frame, (new_width, new_height))# 将彩色图像转换为灰度图像
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 垂直翻转图像
    frame = cv2.flip(frame, 1)# 添加高斯噪声
    frame = add_gaussian_noise(frame)# 将处理后的帧写入输出视频
    out.write(frame)# 释放资源
cap.release()
out.release()
# 关闭所有窗口
cv2.destroyAllWindows()

pickle 文件处理:数据序列化处理

  • pickle 文件是一种特殊的文件格式,用于在 Python 中序列化(serialization)和反序列化(deserialization)Python 对象。序列化是将对象转换为字节流的过程,而反序列化则是从字节流中重新构造对象的过程。
  • pickle 模块提供了一个功能强大的序列化和反序列化工具,可以将几乎所有 Python 对象转换为字节流,然后存储到文件中,也可以从文件中加载这些字节流并重新构造出原始对象。
  • pickle 文件的扩展名通常是 .pkl,.pickle 或者其他类似的扩展名。这些文件可以包含任意 Python 对象的序列化表示,例如字典、列表、类实例等等。pickle 文件在数据持久化、数据传输和对象传递等场景中非常有用,可以轻松地保存和恢复 Python 对象的状态和数据。

pickle 文件操作

  • 保存数据
import pickle
    ​
# 示例数据
    data = {
        'name': 'John',
        'age': 30,
        'is_student': False,
        'grades': [85, 90, 78, 92]
    }# 使用 pickle 保存数据
    with open('data.pkl', 'wb') as file:
        pickle.dump(data, file)
        
运行效果:
生成 data.pkl 文件
  • 加载数据
import pickle
    
    # 使用 pickle 加载数据
    with open('data.pkl', 'rb') as file:
        loaded_data = pickle.load(file)
        
    运行效果:
    {'name': 'John', 'age': 30, 'is_student': False, 'grades': [85, 90, 78, 92]}

综合案例:pickle实战,数据序列化

  • 当训练人工智能算法时,往往需要很长时间,当训练中断时,如果能提前做好权重保存功能,能很快恢复上次进度,以继续进行训练
import pickle
import time
import os
import numpy as np
​
​
# 模拟耗时的权重计算过程
def calculate_weights():
    print("开始计算权重...")
    time.sleep(5)  # 模拟耗时操作
    weights = np.random.rand(10, 10)  # 随机生成权重
    print("权重计算完成.")
    return weights
​
​
# 保存权重和epoch到文件
def save_weights(weights, epoch, filename='weights.pkl'):
    data = {'weights': weights, 'epoch': epoch}
    with open(filename, 'wb') as f:
        pickle.dump(data, f)
    print(f"权重和epoch已保存到{filename}.")
​
​
# 从文件加载权重和epoch
def load_weights(filename='weights.pkl'):
    with open(filename, 'rb') as f:
        data = pickle.load(f)
    print(f"权重和epoch已从{filename}加载.")
    return data['weights'], data['epoch']
​
​
# 主程序
def main():
    weights_file = 'weights.pkl'
    total_epochs = 100  # 假设我们总共需要训练100个epochs# 如果权重文件存在,则加载权重和epoch
    if os.path.exists(weights_file):
        weights, start_epoch = load_weights(weights_file)
    else:
        # 否则,从第一个epoch开始,并计算权重
        weights = calculate_weights()
        start_epoch = 0# 继续训练剩余的epochs
    for epoch in range(start_epoch, total_epochs):
        print(f"开始训练epoch {epoch}...")
        # 这里进行实际的训练代码...
        time.sleep(1)  # 模拟训练过程
        print(f"完成训练epoch {epoch}.")# 每个epoch结束后保存权重和epoch信息
        save_weights(weights, epoch, weights_file)if __name__ == '__main__':
    main()
​
运行结果:
权重和epoch已保存到weights.pkl.
开始训练epoch 72...
完成训练epoch 72.
权重和epoch已保存到weights.pkl.
开始训练epoch 73...
权重和epoch已从weights.pkl加载.
开始训练epoch 72...
完成训练epoch 72.
权重和epoch已保存到weights.pkl.
开始训练epoch 73...
完成训练epoch 73.
权重和epoch已保存到weights.pkl.

PyQt 安装与构建用户界面

  • 在Python中使用PyQt可以快速搭建自己的应用,使得软件有可视化结果\

PyQt 安装与运行

  • 安装 PyQt
pip install pyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 继续安装 QtDesigner
pip install pyqt5-tools  -i https://pypi.tuna.tsinghua.edu.cn/simple --user

Python GUI 快速入门

点击PyCharm 的 File -> Settings -> Tools -> External tools 打开外部工具页面
点击 + 号进入外部工具页面
在”Name"处输入命名,这个名称随便取,只要自己清楚就行
在python安装目录下的Libsite-packagespyqt5_tools文件夹里找到安装的designer.exe所在的路径

PyQt 制作界面实战,图片展示功能

from QtTest import Ui_MainWindow
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog
# 用于显示图片
from PyQt5 import_  QtGui
 
class CamShow(QMainWindow,Ui_MainWindow):
 def __init__(self,parent=None):
  super(CamShow,self).__init__(parent)
  self.setupUi(self)
  # 信号与槽
  self.OpenFileBtn.clicked.connect(self.loadImage)
  
 # 定义按钮点击函数
 def loadImage(self):
     print("按钮被按下了")
     # 文件访问功能
     self.fname, _ = QFileDialog.getOpenFileName(self, caption: '选择图片', directory: '.', filter: '图像文件(*.jpg *.png)')
     print(self.fname)
     # 显示图片
     pix = QtGui.QPixmap(self.fname).scaled(self.ImgeLabel.width(), self.ImgeLabel.height())
     self.ImgeLabel.setPixmap(pix)
 
if __name__ == '__main__':
 app = QApplication(sys.argv)
 ui=CamShow()
 ui.show()
 sys.exit(app.exec_())

优化 PyQt 构建用户界面应用程序

  • PyQt 制作界面优化
调节界面大小:手动调节即可,然后重新执行.ui和mian.py

PyQt 制作界面代码完善

from QtTest import Ui_MainWindow
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox
# 用于显示图片
from PyQt5 import QtGui
 
class CamShow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(CamShow, self).__init__(parent)
        self.setupUi(self)
        # 信号与槽
        self.OpenFileBtn.clicked.connect(self.loadImage)
        # 打开文件点击实现
        self.actionOpen.triggered.connect(self.loadImage)
        # 点击退出实现
        self.actionexit.triggered.connect(self.exit)
        # 点击关于按钮
        self.actionabout.triggered.connect(self.about)
  
    # 定义按钮点击函数
    def loadImage(self):
        # 更新infolabel展示内容
        self.infolabel.setText("打开文件按钮被按下了")
        # 文件访问功能
        self.fname, _ = QFileDialog.getOpenFileName(self, caption='选择图片', directory='.', filter='图像文件(*.jpg *.png)')
        print(self.fname)
        # 显示图片
        pix = QtGui.QPixmap(self.fname).scaled(self.ImgeLabel.width(), self.ImgeLabel.height())
        self.ImgeLabel.setPixmap(pix)
  
    # 定义退出程序功能
    def exit(self):
        sys.exit(app.exec_())
    
    # 关于按钮
    def about(self):
        self.infolabel.setText("帮助按钮被按下了")
        QMessageBox.information(self, title='软件说明', text='该软件由xxx制作而成,软件版本为1.0')
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = CamShow()
    ui.show()
    sys.exit(app.exec_()

最后:

安装包、资料均已打包,需要的小伙伴可以戳这里[学习资料]或扫描下方码!!!!!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/729754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

车载模块负载基础认识

车载模块负载是指车辆上的各种电子设备和系统,如导航系统、音响系统、空调系统、安全气囊等。这些设备和系统在车辆运行过程中需要消耗一定的电能,以保证其正常工作。车载模块负载的基础认识主要包括以下几个方面: 1. 负载类型:车…

GaussDB关键技术原理:高性能(一)

引言 对数据库性能进行优化是令人激动的,无论是对其进行性能需求分析、性能需求设计、性能问题定个位都是富于变化又充满挑战的工作,本章围绕“数据库性能”进行全面系统化的介绍,首先从数据库在现代软件栈中所处的位置出发,介绍…

vue+echarts ----中国地图 下拉选择省份地图中的省份区域高亮显示以及飞线图的效果

vueecharts ----中国地图 下拉选择省份地图中的省份区域高亮显示以及飞线图的效果 1、父组件核心代码&#xff1a;【/utils/area的详细数据】、【/utils/china详细数据】 <template><div class"center"><div class"digital"><el-se…

canvas实现画布拖拽效果 适配Uniapp和Vue (开箱即用)

需求:我司是做AIGC项目最近和地铁项目有关需要实现海报效果图&#xff0c;并且需要使用画布拖拽和修改上传删除等等功能 当时连续加班花了10个工作日搓出来 实现挺简单的但是Canvas数据处理还是挺麻烦的 大概功能如图下 首先我们需要引入Fabric.js 这个库封装好了原生的Canva…

Apifox 快速入门教程

访问示例项目​ 可访问Apifox官网&#xff0c;下载并打开 Apifox 后&#xff0c;你将会看到由系统自动创建的“示例团队”&#xff0c;其中内含一个“示例项目”。 项目中自动生成了与宠物商店有关的数条接口。 手动新建接口​ 新建接口是开发者们最常用的功能之一。Apifox 能…

硫化物固态电解质在全固态锂电池制造领域发展潜力大

硫化物固态电解质在全固态锂电池制造领域发展潜力大 固态电解质主要包括氧化物、硫化物、聚合物等类型。氧化物固态电解质由于研发难度相对较低&#xff0c;是目前主流技术路线。硫化物固态电解质研发难度较高&#xff0c;但性能优异&#xff0c;特别适合制造全固态锂电池&…

小程序wx.uploadFile异步问题

问题&#xff1a;小程序上传文件后我需要后端返回的一个值&#xff0c;但这个值总是在最后面导致需要这个值的方法总是报错&#xff0c;打印测试后发现这它是异步的。但直接使用 await来等待也不行。 uploadImg.wxml <view class"upload-wrap"><view clas…

黑神话悟空-吉吉国王版本【抢先版】

在中国的游戏市场中&#xff0c;一款名为“黑神话悟空”的游戏引起了广泛的关注。这款游戏以中国传统的神话故事“西游记”为背景&#xff0c;创造了一个令人震撼的虚拟世界。今天&#xff0c;我们要来介绍的是这款游戏的一种特殊版本&#xff0c;那就是吉吉国王版本。 在吉吉国…

邮件推送服务商有哪些核心功能?怎么选择?

邮件推送服务商支持哪些营销工具&#xff1f;推送性能如何评估&#xff1f; 邮件推送服务商的核心功能可以帮助企业更高效地管理和优化其电子邮件营销活动&#xff0c;从而提升客户参与度和转化率。AokSend将详细介绍邮件推送服务商的一些核心功能。 邮件推送服务商&#xff…

鸿蒙仓颉编程语音来了,ArkTs语言危矣?

鸿蒙仓颉编程语言来了&#xff0c;请允许我哭会~~呜呜呜~~我的arkts啊 仓颉编程语言文档地址文档中心 鸿蒙直播大会开始一个小时了&#xff0c;地址华为开发者大会&#xff08;HDC 2024&#xff09;主题演讲 同时api12 不再是秘密了 各位&#xff01;公开啦 api12 公开地址…

如何开启Claude 3的Artifacts功能以及如何注册Claude3

就很突然&#xff0c;Claude 3.5&#xff0c;它来了&#xff01; Anthropic发布3.5系列第一个版本Claude 3.5 Sonnet。在多个关键指标中&#xff0c;GPT-4o几乎被吊打&#xff01; 另外Claude 3.5 Sonnet是免费的&#xff0c;提供了跟gpt-4o一样的次数。更高的速度和次数&…

maxwell源码编译安装部署

目录 1、组件环境 2、maxwell安装前提 3、maxwell安装 3.1、maxwell下载 3.1.1、最新版本下载 ​编辑 3.1.2、历史版本下载 3.2、maxwell安装 3.3、maxwell配置 3.2.1、mysql开启binlog 3.3.2、maxwell元数据配置 3.3.3、maxwell配置任务 4、maxwell部署问题 4.1、utf…

Jenkins macos 下 failed to create dmg 操作不被允许hdiutil: create failed - 操作不被允许?

解决方案&#xff1a; 打开设置&#xff0c;选择“隐私与安全”&#xff0c;选择“完全磁盘访问权限”&#xff0c;点击“”&#xff0c;选择jenkins的路径并添加。 同理&#xff0c;添加java的访问权限。

【Android】记录在自己的AMD处理器无法使用Android studio 虚拟机处理过程

文章目录 问题&#xff1a;无法在AMD平台打开Android studio 虚拟机&#xff0c;已解决平台&#xff1a;AMD 5700g系统&#xff1a;win10专业版1、在 amd平台上使用安卓虚拟机需要安装硬件加速器2、关闭win10上的系统服务 问题&#xff1a;无法在AMD平台打开Android studio 虚拟…

java 八股文最集全网站

弟弟快看-教程&#xff0c;程序员编程资料站 | DDKK.COM

关于微信小程序取消获取用户昵称的一些思考

官方说明&#xff0c;有部分小程序乱用授权&#xff0c;强迫用户提交头像和昵称。 核心是微信担心用户信息被滥用。 其一 &#xff0c;微信头像经常是本人真是照片&#xff0c;在现在人工智能算法的加持下&#xff0c;人脸数据太容易被套取。 其二&#xff0c;微信名称同理&…

使用Python发送电子邮件:轻松实现自动化沟通

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 1. 为什么使用Python发送电子邮件&#xff1f; 在当今这个信息爆炸的时代&#xff0c;电子邮件已经成为了日常生活中不可或缺的一部分。无论是工作还是生活&#xff0c;都可能需要通过电子邮件与他人进行沟通。而Py…

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网)

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网) 具体连接伺服驱动器的步骤可参考以下内容: 启动InoDriverShop, 新建或打开工程 如下图所示,选择在线,选中SV660F图标,右侧通信类型选择“TCP—DCP”,点击下一步,同时要选择自己当前使用的网卡…

【文档+源码+调试讲解】国风彩妆网站springboot

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

如何使用 NFTScan NFT API 在 Sei 网络上开发 Web3 应用

Sei Network 是一个专为交易而设计的 Layer 1 区块链。它建立在 Cosmos SDK 上&#xff0c;使用一种称为 Tendermint BFT 的新型共识机制。不仅专攻 DeFi 领域的加密资产交易&#xff0c;更在游戏、社交媒体和 NFTs 等热门 verticals 构建了多功能区块链生态系统。Sei Network …