所以我在/ 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
但目前这只是回归'无' '无'等等,一路下来。
我可能在这里犯了一堆错误。我甚至不在我需要移动文件的部分附近。但我只是希望克服这个第一个驼峰。
非常感谢任何建议!
答案 0 :(得分:1)
问题是,您的name
变量始终以换行符\n
结尾。换行符不存在于文件名中,因此正则表达式找不到任何匹配项。
您的代码还存在一些其他小问题:
names.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)
希望它有所帮助。