移动文件:匹配部分文件/目录标准(姓,名)-Glob,Shutil

时间:2018-10-08 15:03:36

标签: python glob

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

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- Move All PDF Files in Folder to NewDirectory Based on Matching Names, Using Glob or Shutil

Python move files from directories that match given criteria to new directory

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

背景:以下是我的文件夹的细目分类,可让您更好地了解我要做什么。

在:/ Scans文件夹中,我有成千上万个PDF文件,这些文件是根据客户端和内容手动重命名的(我尝试编写一个程序来自动重命名..不起作用),因此该文件夹包含了如下标记的PDF:

姓,名-[contentVariable]

(重复上述100,000x)

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

编辑:下面的代码会将整个Scans文件夹移至Clients文件夹,该文件夹已关闭,但不完全是我需要做的事情。我只需要将“扫描”中的文件移动到相应的客户端折叠名称。

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文件夹的前进步骤。

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)

在“ for glob.glob(r'C:Users / Kenny / Documents / Clients / {^ w,$ w}?”中的文件中有注释吗?”我尝试替换“ Clients / {^ w,$ w}? ,仅带有“ Clients / *”

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

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

Error 1 Error 2

运行第二条命令时,会生成以下错误(尽管没有错误?):

Error 3

编辑/可能的答案

尚未对此进行测试,但是可以使用fnmatch(filename,pattern)或fnmatch.translate(pattern)来测试 filename 字符串是否与 pattern 字符串,返回 True False

也许您可以从这里编写条件语句。

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)

我尚未测试上述两个代码。我不知道它们是否有效,但是编辑可以让其他人看到我的思路正在进步。

0 个答案:

没有答案