2016-05-18 181 views
0

因此,我有一个文件夹中的几千pdf文件在/路径,我有一个名为names.csv数以百计的名单(只有一列,它可以很容易成为.txt)。选择目录中的文件,并根据文件名的文本列表移动它们

我想选择(并理想地,移动)pdfs,其中名称来自names.csv在任何文件名中找到。

从我的研究,到目前为止,好像listdir同时和正则表达式是一个方法至少得到我想要的文件的列表:

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 

但目前这只是返回“无”“无”一直下降。

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

任何意见是非常感谢!

回答

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 
+0

谢谢。是的,我认为'如果字符串中的子串'可以工作,但不知何故,我误入正则表达式,对于我躺着的一些旧的工作示例抱着相当不合逻辑的态度。 我会根据您的建议来解决这个问题。感谢bazillion! – 1rick

+1

为了跟上这一点,我根据您的意见开展工作。虽然我确实在*移动文件*部分,所以我最终用'print filename'替换了那一行。从那里开始,我为移动过程使用了一个完全独立的脚本,在for循环中使用'shutil.move(name,destinationfolder)'。 无论如何,感谢您在这个宝贝步骤中的指导。 :) – 1rick

1

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

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

希望它有帮助。

相关问题