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

在glob循环中索引数组:多CSV文件转Matlab文件的技术问询

解决CSV转Matlab文件时循环中的异常问题

看起来你的代码有几个关键问题导致了循环中的异常,我来帮你逐一排查并修正:

主要问题分析

  1. 重复覆盖同一个.mat文件
    你在循环里每次调用sio.savemat('readcsv', dict(b=b2))时都用了固定的文件名readcsv.mat,这意味着每处理一个CSV,之前的结果就会被覆盖,最后只能得到最后一个CSV的转换结果,这大概率不是你想要的。

  2. 硬编码列索引的风险
    你用val = arange(8,13)指定要删除的列,但如果某个CSV文件的列数不足13列,或者NaN列的位置不固定,就会抛出索引越界的异常。更稳妥的方式是直接检测并删除包含NaN值的列,而不是依赖固定索引。

  3. 不规范的模块导入方式
    使用from numpy import*和from pandas import*会污染全局命名空间,容易引发命名冲突,建议使用标准的别名导入方式。

  4. 过时的DataFrame转数组方法
    df.values已经是较旧的用法,现在pandas官方推荐使用df.to_numpy()来明确转换为NumPy数组。

修正后的代码

import os
from glob import glob
import numpy as np
import pandas as pd
import scipy.io as sio

# 指定目标目录
path = '/Volumes/Some file'

# 遍历所有CSV文件
for filename in glob(os.path.join(path, '*.csv')):
    # 读取CSV,指定分隔符为分号
    df = pd.read_csv(filename, delimiter=';')
    
    # 直接删除包含NaN值的列(替代硬编码索引)
    df_clean = df.dropna(axis=1)
    
    # 转换为NumPy数组
    b2 = df_clean.to_numpy()
    
    # 生成对应的Matlab文件名(保留原文件名,替换后缀为.mat)
    mat_filename = os.path.splitext(os.path.basename(filename))[0] + '.mat'
    mat_save_path = os.path.join(path, mat_filename)
    
    # 保存为Matlab文件,使用数组名对应原数据
    sio.savemat(mat_save_path, {os.path.splitext(os.path.basename(filename))[0]: b2})
    
    print(f"已成功转换并保存:{mat_save_path}")

额外说明

  • 如果你的需求确实是要删除固定索引的列(而不是所有含NaN的列),可以保留delete操作,但需要先检查列数是否足够:
    # 检查列数是否大于等于13,避免索引越界
    if df.shape[1] >= 13:
        b = df.to_numpy()
        val = np.arange(8,13)  # 8到12列(0-based)
        b2 = np.delete(b, val, axis=1)
    else:
        print(f"警告:文件{filename}列数不足,跳过删除操作")
        b2 = df.to_numpy()
    
  • 使用sio.savemat时,字典的key会成为Matlab中变量的名称,建议用原文件名作为变量名,这样在Matlab中更易识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:12