师姐给了一个任务,要我把核磁室导出来的数据自动化处理到能直接丢进去DPABI,这对我来说简直是小事一桩嘛。
原始文件夹结构:
Patients ——> FunRaw ——> sub001 + sub002 + sub003… sub001 ——> EP2D_BOLD_MOCO_0003 EP2D_BOLD_MOCO_0003 ——> 241个XXXXX.IMA 和241个nii
目标文件夹样式结构:
Patients ——> FunRaw ——> Sub001 + Sub002 + Sub003… Sub001 ——> 241个nii
因此,我的编程思路是:先从文件夹里提取出241个nii文件,然后移动到sub文件夹下面,接着替换sub变成Sub,随后删除掉多余的EP2D_BOLDXX文件,最后就是写一个for循环,自动处理完patients和health。
其实这件事儿在linux下很容易完成,linux的文件夹操作非常容易。不过我现在手上用的是windows,没有装双系统和子系统,刚好我最近python也学的差不多了,于是就用python写了一个自动化处理脚本给师姐。
打开我滴记事本,重命名为py后缀,然后手撸代码:
#!/usr/bin/python
########### 导入区 ###########
from pathlib import Path
import os
import shutil
########### 工作区 ########
work_space = r'f:/clancy原始数据/patients/T1Raw/'
########### 更换工作目录 ########
os.chdir(work_space)
########### 获取文件名称 ########
subjects = os.listdir(path='.') #获取受试者名称
######## 循环体:开始自动处理文件 ########
for subject in subjects :
target = Path(work_space, subject) #拼接路径 ../../sub001
_middle_folder = os.listdir(target) #获取中间层名字 EPO
target2 = Path(target, _middle_folder[0]) #拼接路径 ../../sub001/EPO
nii_files = list(Path(target2).glob("*.nii")) #获取所有nii文件的绝对路径
[nii_file.rename(Path(target, nii_file.name)) for nii_file in nii_files ] #移动nii文件
shutil.rmtree(target2) #删除不要的文件
################### 文件夹重命名 sub001 --> Sub001 ########
for subject_old in subjects :
target_old = Path(work_space, subject_old) #旧文件夹绝对路径
target_old.rename(Path(work_space, subject_old.title())) #旧文件夹重命名
################### End ########
打开python3.9,运行脚本文件,2秒钟结束50个受试者的文件整理,效率MAX。
心得:
1.python的pathlib模块很好用,比os模块感觉要好一点。
2.windows下,要学会用python处理数据,用R做统计分析。
3.文件路径就是该文件,直接修改文件路径名称,就相当于mv命令。
“一切皆是文件”,我感觉我对这句话理解的更加深刻了。