python - 移动文件:匹配部分文件/目录条件(姓氏、名字) - 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
问题:如何将 :/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} 的原因?-- 因为我们的客户姓氏相同,但名字不同。
运行第一个命令时产生以下错误:
运行第二个命令时会产生以下错误(虽然,没有错误?):
编辑/可能的答案
尚未对此进行测试,但 fnmatch(filename, pattern) 或 fnmatch.translate(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)
我没有测试过上述两个代码。我不知道它们是否有效,但编辑可以让其他人看到我的思路是如何进展的。
解决方案
推荐阅读
- python - Python:在谷歌云存储中将所有文件读取为 gcs_uri
- powershell - 脚本从 powershell ISE 工作,但不是从 powershell
- java - 进行中的重新平衡异常意外发生
- kubernetes - kubectl status.phase=运行返回错误结果
- javascript - 用 Express 为 Mongoose 编写端点函数的正确方法是什么?
- dart - 飞镖初学者需要帮助
- c# - 带有继承对象的 JsonConvert DeserializeObject
- php - 在 symfony JMS PHP 中将单个字符串属性反序列化为对象
- spock - Micronaut @Replaces 用声明式客户端
- python - 使用 unittest RuntimeError 进行异步测试