2012-10-17 139 views
4

我有名为“a1.txt”,“a2.txt”,“a3.txt”,“a4.txt”,“a5.txt”等文件。然后我有名为“a1_1998”,“a2_1999”,“a3_2000”,“a4_2001”,“a5_2002”等的文件夹。将文件名匹配到文件夹名称,然后移动文件

例如,我想在文件“a1.txt”&文件夹“a1_1998”之间进行连接。 (我猜我需要一个正规的表达来做到这一点)。然后使用shutil将文件“a1.txt”移动到文件夹“a1_1998”,将文件“a2.txt”移动到文件夹“a2_1999”等等中。我对正规表达的理解不够。

import re 
##list files and folders 

r = re.compile('^a(?P') 
m = r.match('a') 
m.group('id') 

## 
##Move files to folders 

我稍微修改了下面的答案,使用shutil移动文件,做了伎俩!

import shutil 
import os 
import glob 

files = glob.glob(r'C:\Wam\*.txt') 

for file in files: 
    # this will remove the .txt extension and keep the "aN" 
    first_part = file[7:-4] 
    # find the matching directory 
    dir = glob.glob(r'C:\Wam\%s_*/' % first_part)[0] 
    shutil.move(file, dir) 

回答

5

您不需要正则表达式。

怎么是这样的:

import glob 
files = glob.glob('*.txt') 
for file in files: 
    # this will remove the .txt extension and keep the "aN" 
    first_part = file[:-4] 
    # find the matching directory 
    dir = glob.glob('%s_*/' % first_part)[0] 
    os.rename(file, os.path.join(dir, file)) 
+0

也许增加一个测试,如果第2个'glob.glob()'真的正好返回一个目录名称... – glglgl

+0

这种解决方案是非常具体的答案,而不是要做到这一点的最好办法。你应该使用'os.path.splitext()'来获得'(filename,extension)'对。 –

+0

@Inbar Rose,'splitext()'是更常用的解决方案,以防您需要从文件名中删除扩展名。不过,我不确定这会永远如此。 OP没有具体说明。 –

0

有轻微的替代,考虑到因巴尔罗斯的建议。

import os 
import glob 

files = glob.glob('*.txt') 
dirs = glob.glob('*_*') 

for file in files: 
    filename = os.path.splitext(file)[0] 
    matchdir = next(x for x in dirs if filename == x.rsplit('_')[0]) 
    os.rename(file, os.path.join(matchdir, file)) 
+0

感谢Talvalin这应该做的伎俩,我只是在matchdir行遇到问题时,我添加到我的文件的路径如下所示:import os import glob files = glob.glob(r'C:\ Wam \ *。docx') dirs = glob.glob(r'C:\ Wam \ * _ *') 是否有另一种指定工作目录的方式? –

+0

使用双引号指定目录应修复该问题。例如:files = glob.glob(“C:\ Wam * .docx”) – Talvalin

相关问题