我想将目录中存在的文件移动到包含文件名中特定字符串的新文件夹中。 以下是我在目录中的文件名示例(数千个(:
WS1_APAL4900.pdf
WS1_APAL4900_A.pdf
WS1_APAL4900_B.pdf
WS1_APAL4900_C.pdf
WS1_CANM0901.pdf
WS1_CANM0901_A.pdf
WS2_CANM0901.pdf
WS2_CANM0901_A.pdf
WS3_CANM0901.pdf
WS3_CANM0901_A.pdf
WS3_CONT6565.pdf
我的目标是将下划线分隔符上的文件名拆分为 2 或 3 个字符串,并从左侧仅取第二个字符串,其中包含一个 8 个单词/数字的字符串并从中创建新文件夹,名称如下:"MFMO1720",无论是具有 2 个还是 3 个字符串的名称。 现在,所有在左侧第一个下划线右侧包含 8 个字符的文件,无论它们的名称中是否没有 OR _A、_B等,都应使用其 8 个字符的名称移动到新文件夹中。
现在,当我运行代码时,带有"_x"的文件都集中在一个文件夹下(即"APAL4900"文件夹包含"WS1_APAL4900_A.pdf"、"WS1_APAL4900_B.pdf"和"WS1_APAL4900_C.pdf",但不是"WS1_APAL4900.pdf"(。没有_A、_B、_C等的文件进入名称中具有.pdf扩展名的文件夹,即。"APAL4900.pdf"仅包含一个文件 (WS1_APAL4900.pdf(。
我尝试了split((和rsplit((以及其他拆分方法,但它们都没有帮助我将具有相同8个字符号的所有文件发送到同一文件夹。
任何帮助将不胜感激!
这是代码:
folder = 'C:/test'
for file_path in glob.glob(os.path.join(folder, '*.*')):
new_dir = file_path.rsplit('_', 2)[1]
try:
os.mkdir(os.path.join(folder, new_dir))
except WindowsError:
# Handle the case where the target dir already exist.
pass
shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))```
如果你想保持它的基本,没有正则表达式,你可以在拆分之前将'.'替换为'_'。
所以像这样(而不是你的new_dir作业(:
new_dir = file_path.replace('.', '_').split('_')[1]
补充一下Dolfa的答案。如果你确实想使用正则表达式,你可以做这样的事情:
import re
new_dir = re.split("_([a-zA-Z0-9]*)(_|.)", file_path)[1]
此正则表达式基本上执行以下操作:
_
匹配字符 _[a-zA-Z0-9]*
匹配 0 或更多 范围 A-Z、A-Z 或 0-9 中的字符_|.
匹配字符 _ 或 。
这将输出:
APAL4900
APAL4900
APAL4900
APAL4900
CANM0901
CANM0901
CANM0901
CANM0901
CANM0901
CANM0901
CONT6565
使用正则表达式的优点之一是,如果您的文件名约定要更改为更复杂的内容,您可以轻松调整它以捕获所需的内容。在您的情况下,由于它是简单的字符串匹配,因此没有必要,因为它只会增加开销。
这非常有效 哈维尔. 这是最终代码:
folder = 'C:/Test'
for file_path in glob.glob(os.path.join(folder, '*.*')):
new_dir = file_path.replace('.', '_').replace(' ', '').split('_')[1]
try:
os.mkdir(os.path.join(folder, new_dir))
except WindowsError:
# Handle the case where the target dir already exist.
pass
shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))