如何将数据集保存至正确的HDF5组?代码报错求解
问题:复刻文件夹结构到HDF5并存储数据集时出错
我写了一个脚本,想遍历指定文件夹,在HDF5文件里创建对应目录结构的组,再读取文件数据保存为HDF5数据集,但不知道怎么把数据集放到正确的组里,还报了错。
原代码
#Development Script Save files in groups #Create HDF5 File name TestFilename = 'N:/TestingPyhonHDF5/progress/automation/GroupTesting.h5' #Set target directory to extract data TargetFolder = 'N:\\Measurements\\T2+\\Rx-BB001' # giving file extensions bin = ('.bin') csv = ('.CSV') tmp = ('.tmp') head = ('.head') ext = ('.bin', '.head', '.tmp', '.CSV') # Create HDF5 Strucutre with h5py.File(TestFilename,'w') as tf: for root, dirs, _ in os.walk(TargetFolder, topdown=True): #print(f'ROOT: {root}') # for Windows, modify root: remove drive letter and replace backslashes: grp_name = root[2:].replace( '\\\\', '/') #print(f'grp_name: {grp_name}\\n') tf.create_group(grp_name) #Open HDF5 file with h5py.File(TestFilename,'a') as tfile: #Iterate files to send to HDF5 file for path, dirc, files in os.walk(TargetFolder): for file in files: if file.endswith(bin): # Create a dtype with the binary data format and the desired column names filePath = os.path.join(path, file) dt = np.dtype('B') data = np.fromfile(filePath, dtype=dt) df = pd.DataFrame(data) #Save as csv savetxt('TempData.csv', df, delimiter=',') #Read bin to HDF5 dfBIN = pd.read_csv('TempData.csv') tfile.create_dataset(grp_name/file, data=dfBIN) #put data in hdf file #add attrs os.remove("TempData.csv") else: continue
报错信息
TypeError Traceback (most recent call last) Cell In [51], line 39 37 #Read bin to HDF5 38 dfBIN = pd.read_csv('TempData.csv') ---> 39 tfile.create_dataset(grp_name/file, data=dfBIN) #put data in hdf file 40 #add attrs 41 os.remove("TempData.csv") TypeError: unsupported operand type(s) for /: 'str' and 'str'
错误原因
- 字符串拼接错误:
grp_name/file是Python不支持的写法,字符串不能用/运算符拼接。 - 变量作用域问题:
grp_name是第一个os.walk循环里的变量,在第二个循环中它只会保留最后一次循环的结果,根本不是当前文件对应的组路径。 - 冗余的CSV中转:把二进制数据转成DataFrame再存成CSV,又读回来存HDF5,完全是多余步骤,既浪费时间又占磁盘空间。
修复后的代码
import os import h5py import numpy as np # 创建HDF5文件名 TestFilename = 'N:/TestingPyhonHDF5/progress/automation/GroupTesting.h5' # 设置目标数据目录 TargetFolder = 'N:\\Measurements\\T2+\\Rx-BB001' # 目标处理的文件扩展名 target_ext = '.bin' # 一次性完成组创建和数据写入 with h5py.File(TestFilename, 'w') as tfile: for root, _, files in os.walk(TargetFolder): # 生成当前目录对应的HDF5组路径(适配Windows路径格式) grp_name = root[2:].replace('\\', '/') # 自动创建组(如果不存在),避免重复创建的问题 current_group = tfile.require_group(grp_name) for file in files: if file.endswith(target_ext): file_path = os.path.join(root, file) # 直接读取二进制数据为numpy数组 data = np.fromfile(file_path, dtype=np.uint8) # 在对应组下创建数据集,用文件名(不含后缀)作为数据集名称 dataset_name = file.rsplit('.', 1)[0] current_group.create_dataset(dataset_name, data=data) # 可选:添加数据集属性,比如源文件路径 # current_group[dataset_name].attrs['source_file'] = file_path
关键修复点
- 合并流程:把创建组和写入数据的流程合并,用
require_group自动处理组的创建,不用单独提前遍历。 - 正确匹配组路径:在每个目录循环中实时生成对应组路径,确保数据存入正确的组。
- 移除冗余步骤:直接用numpy读取二进制数据并创建HDF5数据集,跳过无意义的CSV转换。
- 清晰的数据集命名:用文件名(不含后缀)作为数据集名称,避免扩展名干扰。
内容的提问来源于stack exchange,提问作者Andrew Little
相关产品推荐
相关产品推荐

