You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历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()

代码说明

  1. 文件读取部分:

    • 用os.path.join(path, '*.csv')拼接路径,避免不同系统的路径分隔符问题
    • 增加了异常捕获,处理权限错误和其他读取异常,同时打印错误信息方便排查
    • 增加了判断每行是否有至少两列数据,避免索引越界错误
  2. 高斯拟合部分:

    • 定义了标准高斯函数
    • 使用lmfit.Model来构建拟合模型,设置合理的初始参数猜测(基于原始数据的最大值、均值、标准差)
    • 生成拟合曲线并和原始数据一起绘图
  3. 绘图部分:

    • 用散点图展示原始数据,折线图展示拟合曲线
    • 添加了坐标轴标签、标题、图例和网格,让图表更清晰

内容的提问来源于stack exchange,提问作者Angela Mary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:27:35