1

因此,我在 /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  

但目前这只是返回 'None' 'None' 等,一直向下。

我可能在这里做错了很多事情。而且我什至不在需要移动文件的部分附近。但我只是希望能克服这第一个困难。

非常感谢任何建议!

4

2 回答 2

1

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

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

  • 您在names.csv循环的每次迭代中打开文件。打开文件一次,然后遍历目录中的所有文件会更有效。
  • 正则表达式在这里不是必需的,实际上可能会导致问题。例如,如果 csv 文件中的一行看起来像(this isn't a valid regex,那么您的代码将引发异常。这可以通过先转义来解决,但仍然不需要正则表达式。
  • 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
于 2016-05-18T11:12:50.470 回答
0

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

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

希望能帮助到你。

于 2016-05-18T11:14:38.783 回答