Python 选择目录中的文件并根据文件名的文本列表移动它们
因此,我在/path中有一个包含数千个pdf文件的文件夹,我有一个名为names.csv的数百个名称的列表(只有一列,也可以是.txt) 我正在尝试选择(理想情况下,移动)PDF,在任何文件名中都可以找到names.csv中的任何名称 从我到目前为止的研究来看,listdir和regex似乎是至少获得我想要的文件列表的一种方法: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.
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)
。无论如何,感谢您在这一小步中的指导。:)