74Y1085 发表于 2023-3-31 23:30

救助大佬python 文件夹处理

现在一级文件夹下文件名称:
例:2219-007-180098-P-001
       2219-007-180098-Y-001
       2219-007-180098-K-001
       2219-007-180098-Y-002
       2219-007-180098-Y-003
       2219-007-180098-Y-004
       2219-007-180098-Y-005
       2219-007-180098-JG-001
       2219-007-180098-K-002
-为分隔符前面3段新建一个以2219-007-180098的文件夹,将所有前3段匹配的移动到新创建的文件夹内。*:延伸在建前面4段的2219-007-180098-Y符合的在移入文件夹内。
结果为:
新建的二级文件夹下匹配装入在装入

有大佬帮助么

刘样andholiday 发表于 2023-3-31 23:42

匹配出错了吧

caoliu949 发表于 2023-4-1 00:16

import os
import re

# 定义文件夹路径和正则表达式
folder_path = "path/to/folder"
regex = r"^(\d{4}-\d{3}-\d{6})-{1,2}-\d{3}$"

# 遍历文件夹内所有文件
for filename in os.listdir(folder_path):
    if os.path.isfile(os.path.join(folder_path, filename)):
      # 获取文件名和文件路径
      file_path = os.path.join(folder_path, filename)
      file_name = os.path.basename(file_path)
      
      # 判断文件名是否匹配正则表达式
      match = re.match(regex, file_name)
      if match:
            # 创建新的文件夹并移动文件
            new_folder_path = os.path.join(folder_path, match.group(1))
            if not os.path.exists(new_folder_path):
                os.mkdir(new_folder_path)
            os.rename(file_path, os.path.join(new_folder_path, file_name))
            
            # 如果文件名的第四段是Y,则移动所有前4段相同的文件
            if file_name.split("-") == "Y":
                for y_filename in os.listdir(folder_path):
                  if os.path.isfile(os.path.join(folder_path, y_filename)):
                        y_file_path = os.path.join(folder_path, y_filename)
                        y_file_name = os.path.basename(y_file_path)
                        if re.match(r"^" + match.group(1) + r"-Y-\d{3}$", y_file_name):
                            os.rename(y_file_path, os.path.join(new_folder_path, y_file_name))

ymhld 发表于 2023-4-1 00:24

先比较出文件夹名,然后判定文件,移入就行了

ilinxiao 发表于 2023-4-1 00:39


import os
def movedir(top_dir):
    for dir_name in os.listdir(top_dir):
      # 过滤文件夹名,包含四道杠
      if dir_name.find("-") != -1:
            name_arr = dir_name.split("-")
            item_num = len(name_arr)
            if item_num == 5:
                base_dir = os.path.join(top_dir, dir_name)# 在已有的文件夹里面创建
                for i in range(3, item_num+1):
                  new_dir_name = "-".join(name_arr[:i])
                  base_dir = os.path.join(base_dir, new_dir_name)
                  if not os.path.exists(base_dir):
                        os.makedirs(base_dir)


movedir(r"D:\projects\testproject\test")

效果:
├─2219-007-180098-JG-001
│└─2219-007-180098
│      └─2219-007-180098-JG
│          └─2219-007-180098-JG-001
├─2219-007-180098-K-002
│└─2219-007-180098
│      └─2219-007-180098-K
│          └─2219-007-180098-K-002
└─2219-007-180098-Y-005
    └─2219-007-180098
      └─2219-007-180098-Y
            └─2219-007-180098-Y-005

snowfneg2020 发表于 2023-4-1 05:49

复杂度太高,容易出错,而且不好维护

asd124689 发表于 2023-4-1 07:53

os模块和split 或者re模块

74Y1085 发表于 2023-4-1 20:23

ilinxiao 发表于 2023-4-1 00:39

import os
def movedir(top_dir):


大佬想要效果这样的咋样移动下呢:
├─2219-007-180098
│└─2219-007-180098-JG
│      └─2219-007-180098-JG-001这个是原来的文件夹移动进来的
│         
│└─2219-007-180098-K
│      └─2219-007-180098-K-002这个是原来的文件夹移动进来的
│      
    └─2219-007-180098-Y
      └─2219-007-180098-Y-005这个是原来的文件夹移动进来的
         

74Y1085 发表于 2023-4-1 20:49

caoliu949 发表于 2023-4-1 00:16
import os
import re



大佬,没成功, 遍历文件夹内所有文件,我想要的是文件夹匹配前几段的保持原内容移动到新建的下一级。效果参考5楼这样来表示:
├─2219-007-180098 新建的第一级
│└─2219-007-180098-JG 新建的第二级
│      └─2219-007-180098-JG-001这个是原来的文件夹移动进来的
│         
│└─2219-007-180098-K 新建的第二级(第一级不能建了重复的了)
│      └─2219-007-180098-K-002这个是原来的文件夹移动进来的
│      
    └─2219-007-180098-Y新建的第二级(第一级不能建了重复的了)
      └─2219-007-180098-Y-005这个是原来的文件夹移动进来的

74Y1085 发表于 2023-4-1 20:50

asd124689 发表于 2023-4-1 07:53
os模块和split 或者re模块

还在研究中,以前用过shutil这个来处理过,现在有点困惑不知道怎么写了
页: [1] 2
查看完整版本: 救助大佬python 文件夹处理