编辑:答案以下是该问题的答案。我将在此保留所有后续文本,以向您展示我完成如此简单的任务有多么困难。
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}的原因? -因为我们的客户姓氏相同,但名字不同。
运行第一个命令时会生成以下错误:
运行第二条命令时,会生成以下错误(尽管没有错误?):
编辑/可能的答案
尚未对此进行测试,但是可以使用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)
我尚未测试上述两个代码。我不知道它们是否有效,但是编辑可以让其他人看到我的思路正在进步。