基于文件名相似性删除文件

2024-10-02 12:33:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个相当大的文件夹,其中包含许多csv文件,命名约定如下所示:

GAbc_Pt0_20210605_142451

编辑:Pt值的范围可以是0-4,日期值的范围可以很大

我试图删除共享相同“Pt”值和相同“20210X0X”值的文件,同时保留第一个实例

我怎样才能做到这一点

编辑:这是我目前拥有的

i = 0
pDataLoc = []
for root, subdirectories, files in os.walk(filePath):
    for subdirectory in subdirectories:
        if subdirectory == 'ProcessedData':
            pDataLoc.append(os.path.join(root, subdirectory))
            i+=1

for directory in pDataLoc:
    fileList = os.listdir(directory)

    #splits and collects meta data from file names
    fileNameMetaData = [data for file in os.listdir(directory) for data 
    in re.split("_", file)]

    #Pt 
    srch = 'Pt'
    r = re.compile(fr'(?<=){srch}(?=)')
    site = list(filter(r.findall, fileNameMetaData))

    #date
    srch = '2021'
    r = re.compile(fr'(?<=){srch}(?=)')
    date = list(filter(r.findall, fileNameMetaData))

注意:数据文件存储在嵌套文件夹中

我试图将相关信息编译成一个列表,以便于某种同步的“if==”类型逻辑来识别要删除的文件,但我很难弄清楚如何使用它,更不用说如何在不丢失找到的第一个实例的情况下使用它了

我不确定这是否是最好的方法,因此任何批评都将不胜感激

谢谢


Tags: 文件inre文件夹pt编辑fordata
3条回答

假设您的文件名的字符串“Pt0_20210605”始终位于[5:17]中,您可以使用如下逻辑解决此问题:

import os

f=[]
for root, dirs, files in os.walk('path/to/my/folder'):
    for file in files:
        if file[5:17] in f:
            to_delete=os.path.join(root,file)
            os.remove(to_delete)        
        else:
            f.append(file[5:17])

你可以这样做:

import os

for root, dirs, files in os.walk('path/to/my/folder'):
    for file in files:
        if file.startswith('GAbc_Pt0_20210605'):
            to_delete = os.path.join(root, file)
            print('Deleting: {}'.format(to_delete)
            os.remove(to_delete)

通过这样做,您将递归地查看文件夹并搜索 从GAbc_Pt0_20210605开始(相同的Pt0和相同的日期)。将此更改为另一个pt0或另一个日期,您应该很好

编辑:

在第二条评论中,您可以:

import re
import os

my_list = []
for root, dirs, files in os.walk('my_dir'):
    for file in files:
        match = re.search(r'GAbc_(Pt[0-4])_(\d{8})_.*', file)
        if match:
             pt_value = match.group(1)
             date = match.group(2)
             path_to_file = os.path.join(root, file)
             my_list.append((pt_value, date, path_to_file))

然后,您可以筛选列表并删除所需的文件

我假设GAbc_Pt0_20210605_142451.csv142451部分是24小时格式的14:24:51,即小时:分钟:秒,并且您要保留的“第一个实例”是时间上最早的一个。我希望早上的时间是_072451,而不是_72451

如果这是正确的,您的文件名可以按字母顺序排序,并沿最后的_分割,将前半部分与前半部分进行比较(如果匹配,我们已经保留了一个实例,如果不匹配,新块刚刚开始,这就是要保留的实例):

import os

files = os.listdir()
files.sort()
seen = ''
for file in files:
  if file.endswith(".csv"):
    firsthalf = file[:file.rfind('_')]
    if seen == firsthalf:
      os.remove(file)
    else:
      seen = firsthalf

代码只执行一次最小检查,它不涉及任何不是.csv文件的内容

相关问题 更多 >

    热门问题