【问题标题】:Python: how to move a file with a certain name to a folder with the same namePython:如何将具有特定名称的文件移动到具有相同名称的文件夹中
【发布时间】:2021-04-10 12:53:36
【问题描述】:

我的工作目录有很多文件和文件夹(类似这样):

AAA_SUBFOLDER
AAA_FILE_1
AAA_FILE_2
BBB_SUBFOLDER
BBB_FILE_1
BBB_FILE_2

所以文件和子文件夹都以AAABBB 开头(等等以CCC、DDD..)。我想做的是一个 python 脚本,它将所有AAA 文件移动到AAA 子文件夹,并为所有具有相同名称的文件和子文件夹迭代它以获得一些东西像这样:

AAA_SUBFOLDER
  - AAA_FILE_1
  - AAA_FILE_2
BBB_SUBFOLDER
  - BBB_FILE_1
  - BBB_FILE_2
...

你能帮帮我吗?提前致谢!

【问题讨论】:

  • 到目前为止你尝试过什么?你有遇到什么问题吗?

标签: python directory operating-system


【解决方案1】:

此解决方案应该可以满足您的要求。 步骤:

  1. 确保已安装 python
  2. 将脚本保存到文件(比如说 main.py)
  3. 使用 2 个参数运行保存的文件 - 1 用于您要组织的路径,2 用于子文件夹的分隔符。例如:python main.py -p "D:\path\to\files" -d "_"

!!这不会重新排列内部文件夹,只会重新排列*文件夹。

如果您有任何问题,我很乐意提供帮助。

import os
import argparse
from pathlib import Path

def parse_args() -> tuple:
    ap = argparse.ArgumentParser()
    ap.add_argument("-p", "--path", default="./files", help="path to the folder that needs organizing")
    ap.add_argument("-d", "--delimiter", default="_", help="delimiter of file names")
    return ap.parse_args()

args = parse_args()

for filename in os.listdir(args.path):
    file_path = os.path.join(args.path, filename)
    if not os.path.isfile(file_path):
        continue
    subfolder_name = Path(filename).stem.split(args.delimiter)[0]
    subfolder_path = os.path.join(args.path,subfolder_name)
    os.makedirs(subfolder_path, exist_ok=True)
    os.rename(file_path, os.path.join(subfolder_path, filename))


【讨论】:

  • 谢谢您,我非常感谢您的帮助。效果很好!
【解决方案2】:

这是我使用pathlib rename 的解决方案;)脚本假定当前是您的文件和文件夹的路径。

# using pathlip
from collections import defaultdict
from pathlib import Path

TARGET_DIR = Path('.') # script dir

FILES_AND_FOLDERS = TARGET_DIR.rglob('*')

# storage with files and folders 
storage = defaultdict(list)
for blob in FILES_AND_FOLDERS:
    if blob.is_file():
        storage['files'].append(blob)
    elif blob.is_dir():
        storage['dir'].append(blob)

# for each dir check if file first 3 characters 
# match if so move by rename
    
for directory in storage['dir']:
    for file in storage['files']:
        if file.name[:3] == directory.name[:3]:
            file.rename(directory / file)
    
# you can look at shutil too

【讨论】:

    最近更新 更多