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

Python 选择目录中的文件并根据文件名的文本列表移动它们,python,regex,csv,listdir,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.

因此,我在/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  
但目前这只是返回“无”、“无”等,一直向下

我可能做了很多错事。我甚至不在需要移动文件的地方。但我只是希望能克服第一个困难


任何建议都将不胜感激

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

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

  • 您将在循环的每个迭代中打开
    names.csv
    文件。打开文件一次,然后循环遍历目录中的所有文件会更有效
  • 正则表达式在这里是不必要的,事实上可能会导致问题。例如,如果csv文件中的一行看起来像
    (这不是有效的regex
    ),则代码将抛出异常。这可以由它首先修复,但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

您说your names.csv是一列。这意味着每个名称后面都有一个换行符,在匹配时也会包含该换行符。您可以尝试以下操作:

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

希望能有所帮助。

谢谢。是的,我原以为“if substring in string”可以用,但不知何故,我误用了regex,不符合逻辑地依附于我身边的一些旧的工作示例。我会根据你的建议来解决这个问题。非常感谢!为了跟进这个问题,我根据你的评论使它工作起来。尽管我确实犯了错误在移动文件部分时,我最后用
打印文件名
替换了那一行。从那以后,我在移动过程中使用了一个完全独立的脚本,在for循环中使用
shutil.move(name,destinationfolder)
。无论如何,感谢您在这一小步中的指导。:)