• 处理csv、bmp等常用数据分析操作--python


          请先看思维导图,看是否包含你所需要的东西,如果没有,就可以划走了,免得浪费时间,谢谢

     

    条条大路通罗马,我只是介绍了我掌握的这一条,不喜勿喷,谢谢。


    目录

    一、创建文件夹(多层)

    1、创建多层文件夹(包含子文件夹)

    2、查找多层文件夹中内容

    二、读写CSV

    1、写csv文件

     2、读csv文件

    三、读写bmp图

    1、读取csv,保存为bmp图

     2、读取bmp图

    四、excel中插入数据及图片

    五、综合应用(可直接运行)


    一、创建文件夹(多层)

    1、创建多层文件夹(包含子文件夹)

    1. import os
    2. # 新建多层文件夹
    3. def mkdir(path):
    4. if not os.path.exists(path): # 判断是否存在此路径
    5. os.makedirs(path) # 创建此路径
    6. print("完成新建")
    7. # 主函数
    8. if __name__ == "__main__":
    9. root_path = os.getcwd() # 获取此py文件的路径
    10. print(root_path)
    11. new_folder_path = os.path.join(root_path, "new_folder", "1") # os.path.join的作用,相当于给root_path, "new_folder", "1"添加"\\"
    12. mkdir(new_folder_path)

    运行结果:

    1. "E:\study software\python3.7\python.exe" D:/test/new_folder.py
    2. D:\test
    3. 完成新建
    4. Process finished with exit code 0

    新建多层文件夹效果:

    2、查找多层文件夹中内容

    在上述新建文件夹中,手动新建一个空的txt文件。

     查找到多层文件夹中的txt文件:

    1. import os
    2. # 主函数
    3. if __name__ == "__main__":
    4. root_path = os.getcwd() # 获取此py文件的路径
    5. for root, dirs, files in os.walk(root_path): # os.walk类似于二叉树查找
    6. for file in files: # 判断是否找到最小单位文件,files是文件名列表
    7. if ".txt" in file:
    8. print(file)
    9. print("找到txt文件")
    10. print(root) # txt文件的文件夹路径

    运行结果: 

    1. "E:\study software\python3.7\python.exe" D:/test/find_txt.py
    2. test.txt
    3. 找到txt文件
    4. D:\test\new_folder\1
    5. Process finished with exit code 0

    二、读写CSV

    1、写csv文件

    利用numpy新建矩阵数据,并保存至csv中。

    1. import csv
    2. import numpy as np
    3. import random # 生成随机数的库
    4. import os
    5. # 将data写入对应路径的csv中
    6. def write_csv(data, csvpath):
    7. with open(csvpath, "w", newline="") as f:
    8. writer = csv.writer(f)
    9. writer.writerows(data)
    10. f.close()
    11. print("完成data保存为csv")
    12. # 主函数
    13. if __name__ == "__main__":
    14. root_path = os.getcwd()
    15. data1 = np.ones([100, 30]) # 构成100*30的矩阵
    16. # 数据中叠加噪声
    17. for i in range(100):
    18. for j in range(30):
    19. data1[i, j] += random.randint(1, 254)
    20. csvpath1 = os.path.join(root_path, "test.csv") # csv保存的路径
    21. write_csv(data1, csvpath1)

    运行后上述代码后,得到以下test.csv。 

     2、读csv文件

    1. import numpy as np
    2. import pandas as pd
    3. row_num = 100
    4. col_num = 30
    5. # 读取csv内容至baseData
    6. def read_csv(csvpath):
    7. baseData = pd.read_csv(open(csvpath), header=None, encoding="gdk") # 此读取方式,可以读取包含中文路径的csv文件
    8. baseData = np.array(baseData.values)
    9. baseData = baseData[:row_num, :col_num]
    10. return baseData
    11. # 主函数
    12. if __name__ == "__main__":
    13. csvpath = r"\\?\D:\test\test.csv" # csv存放的路径,加上"\\?\",可以突破python路径长度的限制,方便读取更深层路径下文件
    14. data = read_csv(csvpath)
    15. print(data)

    运行结果:

    1. "E:\study software\python3.7\python.exe" D:/test/read_csv.py
    2. [[ 5. 236. 129. ... 72. 166. 201.]
    3. [ 12. 12. 147. ... 212. 57. 85.]
    4. [ 16. 114. 194. ... 105. 117. 200.]
    5. ...
    6. [ 96. 25. 251. ... 201. 16. 85.]
    7. [169. 206. 113. ... 55. 67. 87.]
    8. [225. 236. 188. ... 205. 173. 155.]]
    9. Process finished with exit code 0

    三、读写bmp

    1、读取csv,保存为bmp图

    1. import numpy as np
    2. import pandas as pd
    3. from PIL import Image # 这个库全称是Pillow
    4. row_num = 100
    5. col_num = 30
    6. # 读取csv内容至baseData
    7. def read_csv(csvpath):
    8. baseData = pd.read_csv(open(csvpath), header=None, encoding="gdk") # 此读取方式,可以读取包含中文路径的csv文件
    9. baseData = np.array(baseData.values)
    10. baseData = baseData[:row_num, :col_num]
    11. return baseData
    12. # 将矩阵数据保存为bmp灰度图
    13. def write_bmp(data, bmppath):
    14. data1 = np.array(data, dtype="uint8") # 转换为无符号8bit,0~255,灰度图
    15. data1 = Image.fromarray(data1)
    16. # 第一个参数为存储地址和名称,第二个为存储的图片类型
    17. data1.save(bmppath, "bmp")
    18. # 主函数
    19. if __name__ == "__main__":
    20. csvpath = r"\\?\D:\test\test.csv" # csv存放的路径,加上"\\?\",可以突破python路径长度的限制,方便读取更深层路径下文件
    21. data = read_csv(csvpath)
    22. bmp_path = r"\\?\D:\test\test.bmp" # bmp存储的路径及名称
    23. write_bmp(data, bmp_path)

    存储的图片,如下所示:(噪点图)

     2、读取bmp图

    1. import numpy as np
    2. from PIL import Image
    3. # 读取csv内容至baseData
    4. def read_bmp(bmp_path):
    5. pic = open(bmp_path, "rb") # 以这种方式读bmp,方便读了之后关闭文件
    6. image = Image.open(pic)
    7. image_data = np.array(image)
    8. data1 = image_data.astype("int16")
    9. pic.close()
    10. return data1
    11. # 主函数
    12. if __name__ == "__main__":
    13. bmp_path = r"\\?\D:\test\test.bmp" # bmp的路径及名称
    14. data = read_bmp(bmp_path)
    15. print(data)

    运行结果:

    1. "E:\study software\python3.7\python.exe" D:/test/read_bmp.py
    2. [[ 5 236 129 ... 72 166 201]
    3. [ 12 12 147 ... 212 57 85]
    4. [ 16 114 194 ... 105 117 200]
    5. ...
    6. [ 96 25 251 ... 201 16 85]
    7. [169 206 113 ... 55 67 87]
    8. [225 236 188 ... 205 173 155]]
    9. Process finished with exit code 0

    四、excel中插入数据及图片

    1、先读取csv数据,然后保存为图片,excel中插入数据std结果,及保存的图片,具体代码如下所示:

    1. import numpy as np
    2. import pandas as pd
    3. from PIL import Image
    4. import xlsxwriter
    5. import os
    6. row_num = 100
    7. col_num = 30
    8. # 读取csv内容至baseData
    9. def read_csv(csvpath):
    10. baseData = pd.read_csv(open(csvpath), header=None, encoding="gdk") # 此读取方式,可以读取包含中文路径的csv文件
    11. baseData = np.array(baseData.values)
    12. baseData = baseData[:row_num, :col_num]
    13. return baseData
    14. # 将矩阵数据保存为bmp灰度图
    15. def write_bmp(data, bmppath):
    16. data1 = np.array(data, dtype="uint8") # 转换为无符号8bit,0~255,灰度图
    17. data1 = Image.fromarray(data1)
    18. # 第一个参数为存储地址和名称,第二个为存储的图片类型
    19. data1.save(bmppath, "bmp")
    20. # 主函数
    21. if __name__ == "__main__":
    22. csvpath = r"\\?\D:\test\test.csv" # csv存放的路径,加上"\\?\",可以突破python路径长度的限制,方便读取更深层路径下文件
    23. data = read_csv(csvpath)
    24. bmp_path = r"\\?\D:\test\test.bmp" # bmp存储的路径及名称
    25. write_bmp(data, bmp_path)
    26. # excel操作相关
    27. root_path = os.getcwd() # 获取当前py文件路径
    28. book = xlsxwriter.Workbook(os.path.join(root_path, "test.xlsx")) # 指定excel存放位置
    29. sheet = book.add_worksheet("test_data") # 新建一页sheet,方便后续操作
    30. headings = ["file_name", "data_std", "pic"] # 表头信息
    31. sheet.write_row("A1", headings) # 从A1开始写表头信息
    32. # 计算数据列std均值
    33. std_count = np.zeros([1, col_num]) # 用于存放每列std值
    34. for i in range(col_num):
    35. std_count[0, i] = np.std(data[:, i])
    36. std_mean = int(np.mean(std_count)) # 将最终结果转成整形
    37. sheet.write_number(1, 1, std_mean) # 第1行,第一列写std_mean,之前的A1相当于是第(0,0)位置
    38. file_name = csvpath.split("\\")[-1] # 字符串按照"\\"符号进行分割,[-1]表示取分割后最后一个字符串
    39. sheet.write_string(1, 0, file_name)
    40. # excel插入图片
    41. sheet.insert_image(1, 2, bmp_path) # excel的sheet页,第1行、第3列插入bmp_path路径下图片
    42. book.close() # 关闭excel

    2、运行之后,得到excel如下所示:

    五、综合应用 

    1、完整代码如下:(可直接运行)

    注:需提前安装好库:numpy、pandas、Pillow、xlsxwriter

    1. # 需提前安装好库:numpy、pandas、Pillow、xlsxwriter
    2. import numpy as np
    3. import pandas as pd
    4. from PIL import Image
    5. import xlsxwriter
    6. import os
    7. import time
    8. import random
    9. import csv
    10. # 定义每帧数据大小
    11. row_num = 100
    12. col_num = 30
    13. # 新建多层文件夹
    14. def mkdir(path):
    15. if not os.path.exists(path): # 判断是否存在此路径
    16. os.makedirs(path) # 创建此路径
    17. print("完成新建")
    18. # 读取csv内容至baseData
    19. def read_csv(csvpath):
    20. baseData = pd.read_csv(open(csvpath), header=None, encoding="gdk") # 此读取方式,可以读取包含中文路径的csv文件
    21. baseData = np.array(baseData.values)
    22. baseData = baseData[:row_num, :col_num]
    23. return baseData
    24. # 将data写入对应路径的csv中
    25. def write_csv(data, csvpath):
    26. with open(csvpath, "w", newline="") as f:
    27. writer = csv.writer(f)
    28. writer.writerows(data)
    29. f.close()
    30. print("完成data保存为csv")
    31. # 将矩阵数据保存为bmp灰度图
    32. def write_bmp(data, bmppath):
    33. data1 = np.array(data, dtype="uint8") # 转换为无符号8bit,0~255,灰度图
    34. data1 = Image.fromarray(data1)
    35. # 第一个参数为存储地址和名称,第二个为存储的图片类型
    36. data1.save(bmppath, "bmp")
    37. # 读取csv内容至baseData
    38. def read_bmp(bmp_path):
    39. pic = open(bmp_path, "rb") # 以这种方式读bmp,方便读了之后关闭文件
    40. image = Image.open(pic)
    41. image_data = np.array(image)
    42. data1 = image_data.astype("int16")
    43. pic.close()
    44. return data1
    45. # 主函数
    46. if __name__ == "__main__":
    47. current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) # 获取当前时间并以指定格式显示
    48. root_path = os.getcwd() # 获取py文件路径
    49. # excel相关信息
    50. book = xlsxwriter.Workbook(os.path.join(root_path, "test.xlsx")) # 指定excel存放位置
    51. sheet = book.add_worksheet("test_data") # 新建一页sheet,方便后续操作
    52. headings = ["file_name", "data_std", "pic"] # 表头信息
    53. sheet.write_row("A1", headings) # 从A1开始写表头信息
    54. count_row = 0 # 计算excel行数
    55. # 1、新建csv数据
    56. save_csv = os.path.join(root_path, "test_folder", "save_csv", current_time)
    57. mkdir(save_csv) # 创建多层文件夹
    58. for k in range(20): # 得到20帧噪声数据 100*30
    59. data1 = np.ones([100, 30]) # 构成100*30的矩阵
    60. # 数据中叠加噪声
    61. for i in range(100):
    62. for j in range(30):
    63. data1[i, j] += random.randint(1, 254)
    64. print("test"+str(k)+".csv")
    65. csvpath1 = os.path.join(save_csv, "test"+str(k)+".csv") # csv保存的路径
    66. write_csv(data1, csvpath1)
    67. # 2、从文件夹中获取csv文件,并绘图
    68. for root, dirs, files in os.walk(root_path):
    69. for file in files:
    70. if ".csv" not in file:
    71. continue
    72. else:
    73. csv_path = os.path.join(root, file)
    74. data = read_csv(csv_path)
    75. bmp_path = csv_path.replace(".csv", ".bmp") # 替换后缀,得到bmp保存路径
    76. write_bmp(data, bmp_path) # 保存图片
    77. # 计算数据列std均值
    78. std_count = np.zeros([1, col_num]) # 用于存放每列std值
    79. for i in range(col_num):
    80. std_count[0, i] = np.std(data[:, i])
    81. std_mean = int(np.mean(std_count)) # 将最终结果转成整形
    82. # 3、插入统计数据及图片至excel中
    83. count_row += 1
    84. sheet.write_number((count_row-1)*6+1, 1, std_mean) # 第1行,第一列写std_mean,之前的A1相当于是第(0,0)位置
    85. file_name = csv_path.split("\\")[-1] # 字符串按照"\\"符号进行分割,[-1]表示取分割后最后一个字符串
    86. sheet.write_string((count_row-1)*6+1, 0, file_name) # (count_row-1)*5 调整excel行间隔
    87. # excel插入图片
    88. sheet.insert_image((count_row-1)*6+1, 2, bmp_path) # excel的sheet页,第1行、第3列插入bmp_path路径下图片
    89. book.close() # 关闭excel

    2、运行生成excel,效果如下所示:

  • 相关阅读:
    实现zotero星标功能且可以排序
    一文了解DataStore(Proto)
    状态定义与深度优先搜索、广度优先搜索
    FPGA - ZYNQ 基于Axi_Lite的PS和PL交互
    哪种蓝牙耳机降噪好?适合国庆假期使用的蓝牙耳机推荐
    枚举和注解01:自定义类实现枚举
    STC 51单片机58——旋转LED
    前端面试题及答案:app怎么做适配的?
    Java核心编程(22)
    随机链表的复制
  • 原文地址:https://blog.csdn.net/qq_38984928/article/details/127948439