遍历CSV文件夹存储数据至数组时遇权限错误与循环逻辑问题,寻求高斯拟合实现方案
解决CSV读取数组、权限错误及后续高斯拟合的问题
我来帮你一步步梳理并解决这些问题:
首先分析你遇到的核心问题
1. Errno 3: Permission denied 权限错误
你代码里写的open(path,"r"),其中path是文件夹路径,不是单个CSV文件的路径。Python无法直接读取文件夹的内容,必须遍历location列表里的每个CSV文件路径,逐个打开文件。
2. While循环的错误
- Python的关键字是小写的
while,不是While(大小写敏感) - 你的需求是遍历所有CSV文件,用
for循环遍历location列表才是正确的逻辑,While location=True:这种写法完全不符合需求,因为location是文件路径的列表,永远不会等于布尔值True。
3. 数据存储的逻辑优化
如果是要把所有CSV文件的x、y数据合并到同一个数组里,当前的xData和yData列表是可行的;如果需要区分不同文件的数据,可以考虑用二维列表或者字典存储,比如all_data = {"filename": {"x": [], "y": []}},不过先按你原本的需求实现合并存储。
修正后的完整代码(含读取、绘图、高斯拟合)
import csv import pandas as pd import numpy as np from matplotlib import pyplot as plt from scipy.optimize import curve_fit from scipy import asarray as ar, exp import lmfit from glob import glob import os from lmfit import Parameters, minimize, report_fit, Model # 定义高斯函数(用于拟合) def gaussian(x, amp, cen, wid): return amp * exp(-(x-cen)**2 / (2*wid**2)) # 文件夹路径 path = r'E:\Users\ConfocalUser\Documents\GitHub\qudi' # 获取所有CSV文件路径 csv_files = glob(os.path.join(path, '*.csv')) xData = [] yData = [] # 遍历每个CSV文件 for file_path in csv_files: print(f"正在读取文件: {os.path.basename(file_path)}") # 打印当前读取的文件名 try: with open(file_path, "r") as f_in: reader = csv.reader(f_in) next(reader) # 跳过表头行 for line in reader: # 确保每行至少有两列数据 if len(line) >= 2: try: float_1 = float(line[0]) float_2 = float(line[1]) xData.append(float_1) yData.append(float_2) except ValueError: print(f"跳过无效行: {line}") continue except PermissionError: print(f"无法读取文件 {file_path}: 权限被拒绝") except Exception as e: print(f"读取文件 {file_path} 时出错: {str(e)}") # 转换为numpy数组(方便后续绘图和拟合) xData = np.array(xData) yData = np.array(yData) # 绘制原始数据散点图 plt.figure(figsize=(10,6)) plt.scatter(xData, yData, label='原始数据', s=5) # 使用lmfit进行高斯拟合 gmodel = Model(gaussian) # 设置初始参数猜测(amp:振幅, cen:中心, wid:宽度) params = gmodel.make_params(amp=np.max(yData), cen=np.mean(xData), wid=np.std(xData)) # 执行拟合 result = gmodel.fit(yData, params, x=xData) # 打印拟合结果报告 print("\n拟合结果报告:") report_fit(result) # 生成拟合曲线的x值和y值 x_fit = np.linspace(np.min(xData), np.max(xData), 1000) y_fit = result.eval(x=x_fit) # 绘制拟合曲线 plt.plot(x_fit, y_fit, 'r-', label='高斯拟合曲线') plt.xlabel('X值') plt.ylabel('Y值') plt.title('X-Y数据及高斯拟合') plt.legend() plt.grid(True) plt.show()
代码说明
文件读取部分:
- 用
os.path.join(path, '*.csv')拼接路径,避免不同系统的路径分隔符问题 - 增加了异常捕获,处理权限错误和其他读取异常,同时打印错误信息方便排查
- 增加了判断每行是否有至少两列数据,避免索引越界错误
- 用
高斯拟合部分:
- 定义了标准高斯函数
- 使用
lmfit.Model来构建拟合模型,设置合理的初始参数猜测(基于原始数据的最大值、均值、标准差) - 生成拟合曲线并和原始数据一起绘图
绘图部分:
- 用散点图展示原始数据,折线图展示拟合曲线
- 添加了坐标轴标签、标题、图例和网格,让图表更清晰
内容的提问来源于stack exchange,提问作者Angela Mary
相关产品推荐
相关产品推荐

