Which Tool Is Best for Single-Cell Format Conversion? The Ultimate 2025 Roundup
With the explosive growth of single-cell technologies, the R and Python ecosystems have each flourished independently — but data format interoperability has become a major headache for researchers. In 2025, with rapidly evolving data structures and an ever-expanding variety of sequencing technologies, format conversion — especially between Seurat objects and AnnData/MuData objects — has only grown more complex. The good news? We now have more mature solutions than ever. Today, let's walk through several stable, well-maintained, and community-active packages (primarily R packages) that can help streamline your analysis workflow.
1. anndataR
Developed by the scverse team, anndataR aims to bring native AnnData manipulation to R without requiring any additional translation layers. It also supports conversion from AnnData to Seurat objects or SingleCellExperiment.
Advantages: Pure R implementation — no Python environment needed; supports custom slot mapping

source: anndataR documentation
Installation
if (!requireNamespace("BiocManager", quietly = TRUE)) {
install.packages("BiocManager")
}
BiocManager::install("anndataR")
Seurat ➡️ AnnData
library(anndataR)
# One-step approach:
write_h5ad(seurat_obj, tempfile(fileext = ".h5ad"))
# Two-step approach:
adata <- as_AnnData(seurat_obj)
adata$write_h5ad(tempfile(fileext = ".h5ad"))
AnnData ➡️ Seurat
# One-step approach:
seurat_obj <- read_h5ad(h5ad_file, as = "Seurat")
# Two-step approach:
adata <- read_h5ad(h5ad_file)
seurat_obj <- adata$as_Seurat()
References
- GitHub: https://github.com/scverse/anndataR
- Official documentation: https://anndatar.data-intuitive.com/
2. zellkonverter
A conversion package developed by the renowned Theis Lab (authors of the Single-cell Best Practices book). Also part of the scverse ecosystem, zellkonverter will likely be superseded by anndataR in the future, but as of now it remains actively maintained. The package bridges AnnData and SingleCellExperiment by routing through an internal Python environment within R.
Advantages: High memory efficiency; supports DelayedArray backend
Installation
if (!requireNamespace("BiocManager", quietly=TRUE)) {
install.packages("BiocManager")
}
BiocManager::install("zellkonverter")
AnnData ➡️ SCE
library(zellkonverter)
sce <- readH5AD(example_h5ad)
# or
sce <- AnnData2SCE(adata)
SCE ➡️ AnnData
out_path <- tempfile(pattern = ".h5ad")
writeH5AD(sce, file = out_path)
# or
adata <- SCE2AnnData(sce)
For the subsequent conversion between SingleCellExperiment and Seurat, you can use Seurat's built-in as.SingleCellExperiment() and as.Seurat() functions.
References
- Official documentation: https://theislab.github.io/zellkonverter/index.html
- GitHub: https://github.com/theislab/zellkonverter/
3. schard
A Python-dependency-free conversion tool developed by the Sanger Institute's cellgeni team. It uses rhdf5 to directly read and write h5ad files. (Note: writing Seurat objects to h5ad does not appear to be supported yet.)
Advantages: Minimal dependencies; no Python environment needed; supports spatial transcriptomics (Visium) conversion
Installation
remotes::install_github("cellgeni/schard")
h5ad ➡️ Seurat
library(schard)
# Read h5ad directly as a Seurat object
seurat <- schard::h5ad2seurat('input.h5ad')
# Supports spatial data (auto-detects Visium data)
seurat_spatial <- schard::h5ad2seurat_spatial('visium.h5ad')
# Can also read by individual slides
visium_list <- schard::h5ad2seurat_spatial('visium.h5ad', simplify = FALSE)
# Read raw counts (from adata.raw.X)
seurat_raw <- schard::h5ad2seurat('input.h5ad', use.raw = TRUE)
h5ad ➡️ SingleCellExperiment
# Also supports conversion to SCE
sce <- schard::h5ad2sce('input.h5ad')
Directly read specific data from an h5ad file
# Inspect h5ad file structure
ls <- rhdf5::h5ls('input.h5ad')
# Read a specific obsm slot (e.g., UMAP coordinates)
umap <- t(schard::h5ad2Matrix('input.h5ad', '/obsm/X_umap'))
# Read metadata
obs <- schard::h5ad2df('input.h5ad', '/obs')
References
4. easySCF
Published by Zhang et al. in Bioinformatics (November 2024), easySCF was specifically designed to solve the efficiency bottleneck of single-cell data exchange between R and Python. The package uses a unified HDF5 format as an intermediate layer and fully supports all new features of Seurat v5.
Advantages: Extremely fast with low memory footprint; full Seurat v5 support; handles large-scale datasets (>1 million cells with automatic BPCells integration); supports Visium HD spatial data
Installation
# Install from GitHub (note: specify the r subdirectory)
install.packages("devtools")
devtools::install_github("xleizi/easySCF/r")
# Python side
pip install easySCFpy
R Usage
library(easySCFr)
# Save Seurat object in h5 format
saveH5(seurat_obj,
FileName = "data.h5",
assay = "RNA",
SeuratVersion = 5, # Supports v5
split_save = TRUE, # Chunk-based saving for large datasets
max_cells_per_subset = 5000)
# Load h5 format
seurat_obj <- loadH5(FileName = "data.h5",
assay = "RNA",
useBPcells = FALSE, # Auto-enabled for >1M cells
readType = "Seurat")
Python Usage
from easySCFpy import saveH5, loadH5
# Load h5 file as a Scanpy AnnData object
adata = loadH5("data.h5", datatype="scanpy")
# Save as h5 format
saveH5(adata, "output.h5",
split_save=True,
compression="gzip")
References
- Paper: Zhang H, et al. easySCF: a tool for enhancing interoperability between R and Python for efficient single-cell data analysis. Bioinformatics 2024;40(12):btae710
- GitHub: https://github.com/xleizi/easySCF
5. MuDataSeurat
A conversion package designed specifically for multimodal data, serving as the R interface to the MuData (Multimodal AnnData) ecosystem. If your data includes multiple modalities such as CITE-seq, ATAC-seq, or spatial transcriptomics, this is your best bet.
Advantages: Native multimodal support; preserves inter-modality relationships; seamless integration with muon (Python)
Installation
remotes::install_github("PMBio/MuDataSeurat")
Seurat (Multimodal) ➡️ MuData
library(MuDataSeurat)
# Works with multi-assay Seurat objects
# e.g., CITE-seq data containing RNA and ADT
WriteH5MU(seurat_multi, "multimodal.h5mu")
MuData ➡️ Seurat
# Read h5mu file; automatically creates a multi-assay Seurat object
seurat_multi <- ReadH5MU("multimodal.h5mu")
# Each modality is automatically assigned to a separate assay
names(seurat_multi@assays) # e.g.: "RNA", "ADT", "ATAC"
References
6. convert2anndata
Developed by Setty Lab, this package provides the most comprehensive conversion capabilities, excelling at preserving complex metadata and alternative experiments. Supports both command-line and in-R usage.
Advantages: Most complete information preservation; supports alternative experiments; recursively converts nested structures; CLI tool enables convenient batch processing
Installation
# Install dependencies first
BiocManager::install(c("SingleCellExperiment",
"SummarizedExperiment",
"S4Vectors"))
# Install main package
remotes::install_github("settylab/convert2anndata")
Command Line
# After setting up the alias
c2a -i seurat_v5.rds -o converted.h5ad
# With additional parameters
c2a -i input.rds -o output.h5ad -a counts --disable-recursive-altExp
R
library(convert2anndata)
# First convert to SCE (if starting from Seurat)
sce <- convert_seurat_to_sce(seurat_obj)
# Then convert to AnnData
ad <- convert_to_anndata(sce,
assayName = "counts",
useAltExp = TRUE) # Preserve altExp
write_h5ad(ad, "output.h5ad")
References
7. srtdisk
A community fork of the original SeuratDisk, specifically addressing Seurat v5 compatibility issues and spatial transcriptomics (Visium) conversion. It uses h5Seurat as a unified intermediate format and requires no Python translation.
⚠️ This fork is personally maintained by the author of this blog. There may still be some bugs, but core functionality has been tested. If you encounter issues, feel free to open a GitHub issue!
Advantages: Supports Seurat v5 and Visium; no Python environment required; preserves command logs and complete metadata
Installation
# Install the fork from GitHub
remotes::install_github("mianaz/seuratdisk-v5")
Seurat v5 ➡️ AnnData
library(srtdisk) # Note: the package has been renamed to srtdisk
# Two-step conversion: first save as h5Seurat
SaveH5Seurat(seurat_v5, filename = "data.h5Seurat")
# Then convert to h5ad
Convert("data.h5Seurat", dest = "h5ad")
AnnData ➡️ Seurat v5
# Supports direct conversion, including spatial data
Convert("spatial.h5ad", dest = "h5seurat")
seurat_spatial <- LoadH5Seurat("spatial.h5seurat")
# Spatial image reconstruction (experimental)
Images(seurat_spatial)
References
Know of other great format conversion packages? Feel free to share and discuss in the comments!
Originally posted on WeChat Official Account: bioinfo_studyroom