首页 > 解决方案 > 移动文件:匹配部分文件/目录条件(姓氏、名字) - Glob、Shutil

问题描述

编辑:答案以下是问题的答案。我会将所有后续文本留在那里,只是为了向您展示我完成如此简单的任务是多么困难..

from pathlib import Path
import shutil

base = "C:/Users/Kenny/Documents/Clients"

for file in Path("C:/Users/Kenny/Documents/Scans").iterdir():
    name = file.stem.split('-')[0].rstrip()
    subdir = Path(base, name)

        if subdir.exists():
    dest = Path(subdir, file.name)
        shutil.move(file, dest)

前言: 我正在尝试编写代码,该代码将根据匹配的客户端名称将数百个 PDF 文件从 :/Scans 文件夹移动到另一个目录中。这个问题在下面链接 - 一个非常善良的人 Elis Byberi 帮助我更正了我的原始代码。虽然我遇到了另一个问题..

要查看我们的讨论和讨论的类似问题:

-Python- 根据匹配名称,使用 Glob 或 Shutil 将文件夹中的所有 PDF 文件移动到 NewDirectory

Python将文件从符合给定条件的目录移动到新目录

问题:如何将 :/Scans 中的所有命名文件移动到 :/Clients 中适当匹配的文件夹中。

背景:这是我的文件夹的细分,让您更好地了解我正在尝试做什么。

在 :/Scans 文件夹中,我有数千个 PDF 文件,根据客户端和内容手动重命名(我尝试编写一个程序来自动重命名.. 没有工作),这样文件夹包含如下标记的 PDF:

姓氏,名字 - [contentVariable]

(重复以上 100,000 次)

在我的计算机的 :/C 驱动器中,我有一个名为“Clients”的文件夹,其中包含每个客户端的子文件夹,命名类似于上面的模式,如“lastName,firstName”

编辑:下面的代码会将整个 Scans 文件夹移动到 Clients 文件夹,该文件夹很接近,但不完全是我需要做的。我只需要将 Scans 中的文件移动到相应的客户端折叠名称。

import glob
import shutil
import os

source = "C:/Users/Kenny/Documents/Scans"
dest = "C:/Users/Kenny/Documents/Clients"
os.chdir("C:/Users/Kenny/Documents/Clients")

pattern = '*,*'
for x in glob.glob(pattern):
    fileName = os.path.join(source, x)
    print(fileName)
    shutil.move(source, dest)

编辑2 - 关闭!:下面的代码会将 Scans 中的所有文件移动到 Clients 文件夹,该文件夹已关闭,但不完全是我需要做的。我需要将每个文件放入 Clients 文件夹中正确的相应文件夹中。

这是我认为移动整个 Scans 文件夹的一步。

source = "C:/Users/Kenny/Documents/Scans"
dest = "C:/Users/Kenny/Documents/Clients"

for (dirpath, dirnames, filenames) in walk(source):
    for file in filenames:
        shutil.move(path.join(dirpath,file), dest)

我也有下面的代码,我知道它没有做我想做的事,所以我肯定错过了一些东西..

import glob
import shutil
import os

path = "C:/Users/Kenny/Documents/Scans"
dirs = os.listdir(path)

for file in dirs:
   print(file)

dest_dir = "C:/Users/Kenny/Documents/Clients/{^w, $w}?"
for file in glob.glob(r'C:Users/Kenny/Documents/Clients/{^w, $w}?'):
    print(file)
    shutil.move(file, dest_dir)

1)我应该使用 os.scandir 而不是 os.listdir 吗?

2)如果我这样修改代码,我是否朝着正确的方向前进:

import glob
import shutil
import os

path = "C:/Users/Kenny/Documents/Scans"
dirs = os.scandir(path)

for file in dirs:
   print(file)

dest_dir = "C:/Users/Kenny/Documents/Clients/*"
for file in glob.glob(r'C:Users/Kenny/Documents/Clients, *'):
    dest_dir = os.path.join(file, glob.glob)
    shutil.move(file, dest_dir)

请注意“glob.glob 中的文件(r'C:Users/Kenny/Documents/Clients/{^w, $w}?' 我尝试将 'Clients/{^w, $w}?' 替换为'客户/*'

对于上述情况,我只需要:/Scans 中的文件,写为“lastName, firstName - [content]” 进行匹配并移动到 /Clients/[lastName, firstName] --- [content] 无关紧要. 但是有贪婪和非贪婪的表达......这就是为什么我不确定使用 * 或 {^w, $w} 的原因?-- 因为我们的客户姓氏相同,但名字不同。

运行第一个命令时产生以下错误:

错误 1 ​​错误 2

运行第二个命令时会产生以下错误(虽然,没有错误?):

错误 3

编辑/可能的答案

尚未对此进行测试,但 fnmatch(filename, pattern) 或 fnmatch.translate(pattern) 可用于测试文件名字符串是否与模式字符串匹配,返回TrueFalse

从这里也许你可以写一个条件语句..

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        shutil.move(source, destination)

或者

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        shutil.move(file.join(eachFile, source), destination)

我没有测试过上述两个代码。我不知道它们是否有效,但编辑可以让其他人看到我的思路是如何进展的。

标签: pythonglob

解决方案


推荐阅读