Which Tool Is Best for Single-Cell Format Conversion? The Ultimate 2025 Roundup

· 5 min read · Analysis Notes

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 documentationsource: 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

  1. GitHub: https://github.com/scverse/anndataR
  2. 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

  1. Official documentation: https://theislab.github.io/zellkonverter/index.html
  2. 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

  1. GitHub: https://github.com/cellgeni/schard

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

  1. 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
  2. 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

  1. GitHub: https://github.com/PMBio/MuDataSeurat

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

  1. GitHub: https://github.com/settylab/convert2anndata

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

  1. GitHub: https://github.com/mianaz/seuratdisk-V5

Know of other great format conversion packages? Feel free to share and discuss in the comments!


Originally posted on WeChat Official Account: bioinfo_studyroom

Single Cell Seurat Downstream