如何将MOF数据集的.CIF文件转换为Pandas兼容的CSV/XLS格式?
将CCDC MOF的CIF文件转换为Pandas兼容格式(CSV/XLS)
方法一:使用pymatgen
pymatgen是材料科学领域常用工具包,可轻松读取CIF文件并提取结构信息,快速转换为Pandas可处理的格式。
步骤1:安装pymatgen
pip install pymatgen
步骤2:单个CIF文件转换
from pymatgen.core.structure import Structure import pandas as pd # 读取目标CIF文件 struct = Structure.from_file("your_mof.cif") # 提取所需结构信息(可按需扩展字段) mof_info = { "化学式": struct.composition.formula, "空间群": struct.get_space_group_info()[0], "晶胞参数_a(Å)": struct.lattice.a, "晶胞参数_b(Å)": struct.lattice.b, "晶胞参数_c(Å)": struct.lattice.c, "晶胞体积(ų)": struct.lattice.volume, "原子总数": len(struct.sites) } # 转换为DataFrame并导出 df = pd.DataFrame([mof_info]) df.to_csv("single_mof_data.csv", index=False) df.to_excel("single_mof_data.xlsx", index=False)
步骤3:批量处理多个CIF文件
针对大量MOF的CIF文件,用循环批量处理:
import os from pymatgen.core.structure import Structure import pandas as pd # 替换为你的CIF文件夹路径 cif_folder = "path/to/your/cif_directory" all_mof_records = [] for file_name in os.listdir(cif_folder): if file_name.endswith(".cif"): try: file_path = os.path.join(cif_folder, file_name) struct = Structure.from_file(file_path) # 提取信息 record = { "文件名": file_name, "化学式": struct.composition.formula, "空间群": struct.get_space_group_info()[0], "晶胞参数_a(Å)": struct.lattice.a, "晶胞参数_b(Å)": struct.lattice.b, "晶胞参数_c(Å)": struct.lattice.c, "晶胞体积(ų)": struct.lattice.volume, "原子总数": len(struct.sites) } all_mof_records.append(record) except Exception as e: print(f"处理{file_name}失败: {str(e)}") # 导出为CSV/XLS df = pd.DataFrame(all_mof_records) df.to_csv("batch_mof_data.csv", index=False) df.to_excel("batch_mof_data.xlsx", index=False)
方法二:使用matminer
matminer基于pymatgen扩展了更丰富的特征提取工具,适合需要复杂结构特征(如孔隙率、吸附相关参数)的场景。
步骤1:安装matminer
pip install matminer
步骤2:提取特征并导出
from matminer.io.cif import CifParser from matminer.featurizers.structure import Density, SpacegroupFeatures import pandas as pd # 读取CIF文件 parser = CifParser("your_mof.cif") struct = parser.get_structures()[0] # 初始化特征提取器 density_feat = Density() spacegroup_feat = SpacegroupFeatures() # 提取特征 density = density_feat.featurize(struct)[0] spacegroup_data = spacegroup_feat.featurize(struct) # 整理数据 mof_info = { "化学式": struct.composition.formula, "密度(g/cm³)": density, "空间群编号": spacegroup_data[0], "空间群符号": spacegroup_data[1], "晶胞体积(ų)": struct.lattice.volume } # 导出 df = pd.DataFrame([mof_info]) df.to_csv("mof_matminer_data.csv", index=False)
批量处理
批量处理逻辑与pymatgen一致,将单个文件的处理逻辑放入循环即可。
注意事项
- 部分CCDC的CIF文件可能包含非标准标记,若出现读取错误,可检查文件完整性或跳过报错文件。
- 可根据储氢研究需求扩展提取的特征,比如利用matminer或poreblazer提取孔隙直径、比表面积等参数。
内容的提问来源于stack exchange,提问作者CountZer0
相关产品推荐
相关产品推荐

