最近做 CSI 数据的采集工作。由于网络时断时续,使得采集到的数据保存在了不同的文件夹中,每个文件夹中的文件数量也参差不齐。为了后续使用方便,需要将这些数据文件统一命名并存放在同一个文件夹中。Python 无疑是实现这项工作的首选工具。下面给出我的 Python 代码。

import os, shutil

def batchRenameFile(srcDirName, destDirName):  # srcDirName 为源文件夹的绝对路径,真正保存数据文件的子文件夹都在该文件夹下;destDirName 为目标文件夹的绝对路径
    i = 1;
    subDirNameList = os.listdir(srcDirName)  # 获取真正保存数据文件的文件夹序列
    for subDirName in subDirNameList:
        fileList = os.listdir(srcDirName+'/'+subDirName)    # 此处须给出绝对路径
        for file in fileList[7::]:    # 由于每次采集信号时最初采集到的信号不稳定,因而将每次采集到的前 7 个文件忽略
            shutil.copy(srcDirName+'/'+subDirName+'/'+file, destDirName+'/csi'+str(i)+'.dat')  # 此处须给出绝对路径
            i = i+1
srcDirName = '/home/PycharmProjects/CNN_Human_Behaviour_Detection/cnnHBD/csiDataFalling'
destDirName = '/home/PycharmProjects/CNN_Human_Behaviour_Detection/cnnHBD/csiDataFallingNew'
batchRenameFile(srcDirName, destDirName)

注:对上述代码进行修改,也可以轻松地实现对文件夹中文件的递归操作,例如删除、移动、重命名等。

补充:
下面的代码在上述基础上实现了按照文件的创建顺序对文件进行移动(复制)和统一命名。
(需要先用 ls -trl 命令按照子文件夹的创建时间递增查看子文件夹,并按照该顺序用自然数对子文件夹重新递增命名。)

import os, shutil

def batchRenameFile(srcDirName, destDirName):  # srcDirName 为源文件夹的绝对路径;destDirName 为目标文件夹的绝对路径
    i = 1;
    subDirNameList = os.listdir(srcDirName)
    subDirNameList.sort(key=lambda x:int(x[0:]))  # 按照子文件夹名称递增排序
    # print (subDirNameList)  # 查看排序结果
    for subDirName in subDirNameList:
        fileList = os.listdir(srcDirName+'/'+subDirName)    # 此处须给出绝对路径
        fileList.sort(key=lambda x:int(x[3:-4]))   # 按照文件名字符串中的数字部分(下标由3开始,至倒数第4个字符结束,不含倒数第四个字符)递增排序(这也是同一子文件夹中所有文件的创建顺序)
        # print (fileList)  # 查看排序结果
        for file in fileList[10::]:    # 由于每次采集信号时最初采集到的信号不稳定,因而将每次采集到的前 10 个文件忽略
            shutil.copy(srcDirName+'/'+subDirName+'/'+file, destDirName+'/csi'+str(i)+'.dat')  # 此处须给出绝对路径
            i = i+1
srcDirName = '/home/PycharmProjects/CNN_Human_Behaviour_Detection/cnnHBD/csiDataWalking'
destDirName = '/home/PycharmProjects/CNN_Human_Behaviour_Detection/cnnHBD/csiDataWalkingNew'
batchRenameFile(srcDirName, destDirName)