我目前做生信分析使用的文件树

我目前做生信分析使用的文件树

前言

做一个好的项目,好的文件结构必不可少,一个好的文件树可以保证阅读性、可复用性和可维护性。好在生信项目的流程很固定,所以文件树也不需要那么复杂。

通常一个生信项目会包含这些步骤:数据导入-数据分析-数据可视化-数据导出-结果分析。因此我构建的文件树格式也大致如此。

文件树结构

根据生信分析的一般步骤,我目前使用的文件树结构如下,目前展示的是一个以 R 语言为主的示例,当然也可以很轻松的改变为 Python 为主,或者 Python 与 R 语言混用的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
project/
├── data/
│ ├ raw/
│ │ ├ GSExxxxxx_RAW/
│ │ └ ...
│ └ processed/
│ ├ 1_preprocess.Rdata
│ └ ...
├── src/
│ ├ main/
│ │ ├ 1_preprocess.R
│ └ utils/
│ ├ plot_volcano.R
│ └ ...
├── output/
│ ├ figures/
│ │ ├ 1_preprocess/
│ │ │ ├ 1_1_density.png
│ │ │ └ ...
│ │ └ ...
│ └ tables/
│ ├ 1_preprocess/
│ │ ├ 1_1_expr.csv
│ │ └ ...
│ └ ...
├── report/
│ ├ 1_preprocess.md
│ └ ...
├── README.md
└── ...
  1. data/:存放数据:
    1. raw/:存放原始数据,按照数据来源或数据格式安排子文件夹;
    2. processed/:存放处理后的数据,每一个分析步骤对应一个结果文件,R 语言使用 .Rdata 格式,Python 可以使用 .pkl.h5ad 格式等等;
  2. src/:存放源代码:
    1. main/:存放主要代码,每一个文件对应一个分析步骤,比如数据预处理、差异分析、富集分析等等;
    2. utils/:存放工具函数,比如差异分析时常需要画火山图,我就会写一个 plot_volcano.R ,然后在主文件中使用 source("src/utils/plot_volcano.R") 引入,等等,这样可以极大的提高代码的可复用性,甚至可以将工具函数写成一个包,方便其他项目使用,或者发到 CRAN 仓库,等等;
  3. output/:存放输出结果:
    1. figures/:存放图片,按照步骤和子步骤安排子文件夹,做好编号,对应结果产生的顺序;
    2. tables/:存放表格,同样按照步骤和子步骤安排子文件夹,做好编号,对应结果产生的顺序;
    3. 当然如果有其他格式的结果输出,也可以自行安排别的文件夹;
  4. report/:存放报告,可以是 .md / .Rmd 格式,也可以是 .pdf 格式,或者 .docx 格式等等,每个文件对应一个分析步骤,将分析的流程与相应的结果解释清楚呈现在报告中;
  5. README.md:项目描述文件,可以写一个项目简介,项目结构,项目依赖等等,这样别人可以快速了解你的项目;
  6. 其他文件, 比如 LISENSE 或者 requirements.txt 等等,根据项目需要自行添加。

创建文件树

每次都手动创建这么多文件夹还挺麻烦的,Windows 环境下我们可以使用批处理文件批量生成文件夹,Linux 或者 Mac 环境下也可以使用 shell 脚本批量生成文件夹。

Windows

创建 init_dir.bat 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
md data
md data\raw
md data\processed
md src
md src\main
md src\utils
md output
md output\figures
md output\tables
md report
cd .>README.md

可以把 init_dir.bat 文件放在项目根目录下,双击即可创建文件树。

Linux

创建 init_dir.sh 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
mkdir data
mkdir data/raw
mkdir data/processed
mkdir src
mkdir src/main
mkdir src/utils
mkdir output
mkdir output/figures
mkdir output/tables
mkdir report
touch README.md

可以把 init_dir.sh 文件放在项目根目录下,然后使用 bash init_dir.sh 命令创建文件树。

Mac

创建 init_dir.sh 文件,内容与上述 Linux 一样,但是 .sh 文件在 Mac 上运行时需要在终端使用 sh init_dir.sh 命令,很不方便,我们可以把后缀名改为 .command,这样 init_dir.command 文件就可以直接在 Finder 中双击运行了。

其他常见的文件树结构

其实更常见的文件结构是将每一个步骤单独放在一个文件夹中,比如:

1
2
3
4
5
6
7
8
9
10
11
12
project/
├── 1_preprocess/
│ ├── rawdata/
│ ├── 1_preprocess.R
│ ├── 1_1_density.png
│ ├── 1_1_expr.csv
│ ├── 1_preprocess.Rdata
│ └── ...
├── 2_differential_analysis/
│ └── ...
├── report.md
└── ...

这种结构的好处是每一个步骤所需要的文件都在同一个文件夹中,分析时不用频繁的切换目录;但是缺点是不同的文件类型放在同一个文件夹中很凌乱,也可能会发生误覆盖,而且查看结果时依然需要频繁切换目录。而且我想说,现在大家写代码都会给文本编辑器配置文件树的,不用在终端或者资源管理器里切换目录,反而查看结果的时候因为要打开图片或者 pdf 文件才没有那么方便。总之就我个人而言,我觉得我现在使用的结构更加清爽。

后记

当然我在这里也只是提供了一个参考,也不是说可以完全符合各种项目的需求,比方说一些工业化程度高的项目会用脚本或者 pipeline 管理工具来进行流水线生产,这样我的这个结构可能就不是非常适用了,当然我也在研究如何提高这方面的适配性,有新的心得了也会发布在这里,大家目前都可以根据自己的需求和项目情况来选择适合自己的文件树结构。