通过名称搜索多个文件并复制到新文件夹
我一直在尝试写一些Python代码,目的是从一个.txt文件中逐行读取每个文件名,然后在一个文件夹及其子文件夹中查找这个文件名对应的文件。找到之后,我想把这个文件复制到一个预设的目标文件夹里。
问题是,当我测试这段代码时,我可以读取.txt文件中的所有文件名,也能显示一个目录及其子目录中的所有文件。但当我需要把从.txt文件中逐行读取的文件名与目录中的所有文件名进行比较,然后把找到的文件复制过去时,就出现了问题。
有没有人知道我哪里做错了?
import os, shutil
def main():
dst = '/Users/jorjis/Desktop/new'
f = open('/Users/jorjis/Desktop/articles.txt', 'rb')
lines = [line[:-1] for line in f]
for files in os.walk("/Users/jorjis/Desktop/folder/"):
for line in lines:
if line == files:
shutil.copy('/dir/file.ext', '/new/dir')
2 个回答
0
如果让我猜的话,我觉得这些.txt
文件里包含了完整的路径。你可能需要在os.walk
的基础上再加点东西,才能完全匹配。
for root, _, files in os.walk("/Users/jorjis/Desktop/folder/"):
for f in files:
new_path = f + root
if new_path in lines:
shutil.copy(new_path, `/some_new_dir')
不过,我也不太确定.txt
文件的具体内容,所以也有可能你原来的方法就能奏效。如果是这样的话,建议你仔细看看lines = ...
这一行。
1
你正在把文本文件里的文件名和一个包含三个部分的元组进行比较:当前访问的文件夹的根路径、该路径下所有子文件夹的名称列表,以及该路径下所有文件的名称列表。把一个字符串和一个元组进行比较是永远不会成立的。你需要把每个文件名和要复制的文件名集合进行比较。这里用到的数据类型set
会很有用。
使用with
语句打开文件,可以确保在离开with
块时文件会自动关闭。
代码可能看起来像这样:
import os
import shutil
def main():
destination = '/Users/jorjis/Desktop/new'
with open('/Users/jorjis/Desktop/articles.txt', 'r') as lines:
filenames_to_copy = set(line.rstrip() for line in lines)
for root, _, filenames in os.walk('/Users/jorjis/Desktop/folder/'):
for filename in filenames:
if filename in filenames_to_copy:
shutil.copy(os.path.join(root, filename), destination)