我想将目录中存在的文件移动到新文件夹中,该文件夹包含文件名中的特定字符串。 这是我在目录中(数千个)中文件名的示例:
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个字符的文件,无论它们的名称是否不具有或具有_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)))```
答案 0 :(得分:0)
如果要使其保持基本状态,而无需正则表达式,则可以替换为'。分割前用'_'代替。
类似(代替您的new_dir分配):
new_dir = file_path.replace('.', '_').split('_')[1]
答案 1 :(得分:0)
添加到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
使用正则表达式的优点之一是,如果要将文件名约定更改为更复杂的名称,则可以轻松地对其进行调整以捕获所需的内容。在您的情况下,由于这是一个简单的字符串匹配,因此没有必要,因为这只会增加开销。
答案 2 :(得分:0)
完全可以使用Javier。 这是最终代码:
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)))