选择目录中的文件并根据文件名的文本列表移动它们

时间:2016-05-18 10:56:06

标签: python regex csv listdir

所以我在/ path中有几千个pdf文件的文件夹,我有一个名为names.csv的数百个名称的列表(只有一个列,它可以很容易就是.txt)。

我试图选择(理想情况下,移动)pdf,其中names.csv中的任何名称都可以在任何文件名中找到。

从我目前的研究来看,似乎listdir和regex是一种方法,至少可以获得我想要的文件列表:

import os, sys  
import re 


for files in os.listdir('path'):
    with open('names.csv') as names: 
        for name in names:
            match  = re.search(name, files)

        print match  

但目前这只是回归'无' '无'等等,一路下来。

我可能在这里犯了一堆错误。我甚至不在我需要移动文件的部分附近。但我只是希望克服这个第一个驼峰。

非常感谢任何建议!

2 个答案:

答案 0 :(得分:1)

问题是,您的name变量始终以换行符\n结尾。换行符不存在于文件名中,因此正则表达式找不到任何匹配项。

您的代码还存在一些其他小问题:

  • 您在循环的每次迭代中打开names.csv文件。打开文件一次,然后循环遍历目录中的所有文件会更有效。
  • 此处不需要正则表达式,实际上可能会导致问题。例如,如果csv文件中的一行看起来像(this isn't a valid regex,那么您的代码将抛出异常。这可以先由escaping修复,但仍然没有必要使用正则表达式。
  • 您的print match位置错误。由于在循环的每次迭代中都会覆盖match,并且在循环后打印其值,因此只能看到它的最后一个值。

固定代码可能如下所示:

import os

# open the file, make a list of all filenames, close the file
with open('names.csv') as names_file:
    # use .strip() to remove trailing whitespace and line breaks
    names= [line.strip() for line in names_file] 

for filename in os.listdir('path'):
    for name in names:
        # no need for re.search, just use the "in" operator
        if name in filename:
             # move the file
             os.rename(os.path.join('path', filename), '/path/to/somewhere/else')
             break

答案 1 :(得分:1)

你说你的names.csv是一列。这必须意味着每个名称后跟一个换行符,匹配时也会包含换行符。你可以试试这个:

match  = re.search(name.rstrip(), files)

希望它有所帮助。