按名称搜索多个文件并复制到新文件夹

时间:2014-07-09 13:57:35

标签: python input copy directory

我一直在尝试编写一些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 :(得分: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 :(得分:0)

您正在将文本文件中的文件名与具有三个元素的元组进行比较:当前访问过的文件夹的根路径,该路径中所有子目录名称的列表以及该路径中所有文件名的列表。将字符串与元组进行比较将永远不会为真。您必须将每个文件名与要复制的文件名集进行比较。数据类型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)