【问题标题】:Select files in directory and move them based on text list of filenames选择目录中的文件并根据文件名的文本列表移动它们
【发布时间】:2016-09-14 19:36:36
【问题描述】:

所以我在 /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' 等,一直返回。

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

非常感谢任何建议!

【问题讨论】:

    标签: python regex csv listdir


    【解决方案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
    

    【讨论】:

    • 谢谢。是的,我认为'如果字符串中的子字符串'会起作用,但不知何故我误入正则表达式,相当不合逻辑地坚持我周围的一些旧工作示例。我会根据你的建议解决这个问题。非常感谢!
    • 只是为了跟进这件事,我根据您的评论让它工作了。虽然我确实在 move the file 部分遇到了问题,但我最终只用print filename 替换了该行。从那里,我为移动过程使用了一个完全独立的脚本,在 for 循环中使用 shutil.move(name, destinationfolder)。无论如何,感谢您在这一步中的指导。 :)
    【解决方案2】:

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

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 2021-07-12
      • 2019-04-24
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多