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

1 投票
2 回答
4090 浏览
提问于 2025-04-18 12:38

我一直在尝试写一些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)

撰写回答